DockerでGo言語のホットリロード環境を準備する

目標としてはDockerでGo言語の開発環境を作ること
それに加えてホットリロードをできるようにする
本来docker上でホットリロードをするのはあまりお勧めできないけれど
今回は検証含めて。

プロジェクトの下準備

$ mkdir go-app
$ cd go-app
$ touch docker-compose.yml Dockerfile .realize.yaml

docker-compose.yml

version: '3'
services:
  app:
    build: .
    container_name: go_container
    tty: true
    volumes:
      - ./:/app
    working_dir: /app
    ports:
      - "8080:8080"

Dockerfileの準備
今回インストールするパッケージはginとrealize

Dockerfile

FROM golang:latest
RUN go get github.com/oxequa/realize
RUN go get -u github.com/gin-gonic/gin

EXPOSE 8080
CMD [ "realize", "start", "--run" ]

続いてrealizeの設定ファイル
ymlファイルではなくyamlファイルの準備をすること

.realize.yaml

settings:
  legacy:
    force: false
    interval: 0s
schema:
  - name: api
    path: api
    commands:
      build:
        status: true
        method: go build -o /go/bin/api
      run:
        status: true
        method: /go/bin/api
    watcher:
      extensions:
        - go
      paths:
        - /
      ignored_paths:
        - .git
        - .realize

apiディレクトリにmainファイルを作成

$ mkdir api
$ touch /api/main.go

main.go

package main

import (
  "net/http"
  "github.com/gin-gonic/gin"
)

func main() {
  router := gin.Default()

  router.GET("/hello", func(c *gin.Context) {
    c.String(http.StatusOK, "Hello World!!")
  })

  router.Run(":8080")
}
$ docker-compose build
$ docker-compose up

localhost:8080/helloにアクセスして表示できれば成功
Hello Worldの文字列を適当な文字列に書き換えてみてページリフレッシュ、文字列が変更されていればOKです

関連記事