Docker でローカル環境構築 Nginx + Go + Gin + realize でローカル開発

環境

  • 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 名は適当に
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