環境
- MacBook Pro (macOS: Big Sur)
ファイル構成
/app
├ .realize.yaml
├ /bin
│ └ dev
├ go.mod
└ main.go
docker-compose.yaml
Dockerfile
/nginx
└ default.conf
サンプルコード
- コンテナ内で watch させながら go + gin の開発できるローカル環境を作る。
- これによって PC 側でファイルを変更してもコンテナ内で watch してビルドしてくれるので楽に反映される。
docker-compose.yaml
version: "3"
services:
app:
build:
context: .
volumes:
- ./app:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
ports:
- "8080:80"
Dockerfile
- go のイメージからコンテナを作成すると /go と /usr/local/go が作られるので、
nginx イメージを作成した後にコピーする。
- 最後にシェルスクリプトを呼び出す。
# Golag
# https://hub.docker.com/_/golang
FROM golang:1 as golang
RUN go get -u github.com/tockins/realize
# Nginx
# https://hub.docker.com/_/nginx
FROM nginx:1
WORKDIR /var/www/html
COPY --from=golang /go /go
COPY --from=golang /usr/local/go /usr/local/go
COPY ./app /var/www/html
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
CMD [ "bin/dev" ]
nginx/default.conf
upstream nginx_sample {
server localhost:8080;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
root /var/www/html;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://nginx_sample/;
}
index index.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
}
app/.realize.yaml
settings:
legacy:
force: false
interval: 0s
schema:
- name: api
path: .
commands:
install:
status: true
method: go build -o main
run:
status: true
method: ./main
watcher:
extensions:
- go
paths:
- /
ignored_paths:
- .git
- .realize
- vendor
app/bin/dev
$ cd /path/to/your/project/app/bin
$ chmod 744 dev
- docker-compose up した時に呼ばれる。
- nginx イメージを最終的に元としてるので、 go のパスが通ってないので通す。
- CMD でこのファイルを呼ぶと nginx が起動しないので起動させる。
- 最後に realize をして watch させる。
#!/bin/sh
export PATH=$PATH:/usr/local/go/bin
export GOPATH=/go
export PATH=$PATH:$GOPATH/bin
/etc/init.d/nginx start
go mod tidy
realize s
app/go.mod
module github.com/psychedelicnekopunch/docker-sample
go 1.15
require github.com/gin-gonic/gin v1.6.3
app/main.go
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "hello world! docker-sample/golang-gin",
})
})
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
// r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
r.Run(":8080")
}
実行
$ cd /path/to/your/project
# http://localhost:8080 にアクセス
$ docker-compose up