LoginSignup
8
4

More than 3 years have passed since last update.

docker-compose + realizeでライブリロードする環境構築

Last updated at Posted at 2020-01-26

goで開発しているとコード変更のたびにビルドするのが面倒くさいので
realizeを使ってライブリロードしてサクサクコーディングできるように環境構築した時の設定をメモっておいてます。

パッケージ構造

.
├── api/
│   └── main.go
├── .realize.yaml
├── docker-compose.yml
└── Dockerfile

設定ファイル

Dockerfile

go getrealizeを取得しておきます。
またCMDにはrealizeの起動コマンドを設定しておきます。

FROM golang:1.13

RUN go get github.com/oxequa/realize

EXPOSE 8080

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

docker-compose.yml

.realize.yamlが配置されているディレクトリをworking_dirに設定しておきます。
今回はdocker-compose.ymlと同じディレクトリに配置したので、volumesに設定したディレクトと同じ場所を指定しています。

version: "3"

services:
  go:
    build: .
    ports:
      - 8080:8080
    volumes:
      - ./:/app
    working_dir: /app

.realize.yaml

realizeの設定ファイルです。
拡張子はymlじゃなくてyamlです!

ググると出てくるこちらの記事 → Realize が Go 1.11 の Modules で使えない に書いてありますが
realizeはGo Modulesに対応していないようで、issueの解決策にあるようにcommandにちょっと設定が必要になります。

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.goは以下のようなSampleを出力するだけのAPIを用意します。

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Sample")
    })
    http.ListenAndServe(":8080", nil)
}

確認①

起動すると以下のようなログが出ます

$ docker-compose up
〜〜〜 略 〜〜〜

go_1  | [15:11:08][API] : Watching 1 file/s 1 folder/s
go_1  | [15:11:08][API] : Build started
go_1  | [15:11:10][API] : Build completed in 2.703 s
go_1  | [15:11:10][API] : Running..

この状態でlocalhost:8080を叩くとSampleが出力されます

$ curl http://localhost:8080
Sample

とりあえずAPIが動いていることが確認できました。

確認②

続けてテスト用のコードを編集して保存してみます。
fmt.Fprintf()をSample -> HogeHogeに変更しただけ)

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "HogeHoge")
    })
    http.ListenAndServe(":8080", nil)
}

保存すると以下のようにログが出力されます。
変更されたファイルが表示され、自動でビルドされているのがわかります。

go_1  | [15:16:18][API] : GO changed /app/api/main.go
go_1  | [15:16:18][API] : Build started
go_1  | [15:16:19][API] : Build completed in 1.777 s
go_1  | [15:16:19][API] : Running..

この状態でlocalhost:8080を叩くと変更後のHogeHogeが出力されました。

$ curl http://localhost:8080
HogeHoge
8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4