やりたいこと
- Echo でコンテナ内にサーバーを立てる
- ファイル変更するたびにコンテナ立ち上げ直すのが面倒なので、ホットリロードできるようにする
docker 関連のファイル作成
- プロジェクト名は
echo-hot-reload
とする
ディレクトリ構成
echo-hot-reload
├── Dockerfile
└── compose.yml
Dockerfile
FROM golang:1.20.7-bookworm
RUN apt-get update \
&& apt-get install -y
RUN mkdir -p /home/echo-hot-reload-test
WORKDIR /home/echo-hot-reload-test
compose.yaml
version:'3.8'services:app:build: .
tty:truerestart: always
ports:- 8080:8080
volumes:- ./:/home/echo-hot-reload-test
コンテナ立ち上げ
$ docker compose up -d
Echo インストール
$ docker compose exec app bash
$ go mod init github.com/kyoruni/echo-hot-reload-test
$ go get github.com/labstack/echo/v4
$ touch server.go
server.go
package main
import (
"net/http""github.com/labstack/echo/v4"
)
func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
})
e.Logger.Fatal(e.Start(":8080"))
}
サーバー立ち上げ
- ブラウザで
localhost:8080
を表示すると、「Hello, World!」が出ることを確認
$ go run server.go
Air インストール
$ exit
$ docker compose down
Dockerfile
FROM golang:1.20.7-bookworm
RUN apt-get update \
&& apt-get install -y
RUN mkdir -p /home/echo-hot-reload-test
RUN go install github.com/cosmtrek/air@latest
WORKDIR /home/echo-hot-reload-test
$ docker compose build
$ docker compose up -d
$ docker compose exec app bash
$ air init
ここまでのディレクトリ構成
echo-hot-reload-test
├── .air.toml
├── Dockerfile
├── compose.yml
├── go.mod
├── go.sum
├── server.go
└── tmp
└── main
Air 起動して、ホットリロードを試す
$ docker compose down
compose.yaml
- コンテナ立ち上げ時、Air を実行するコマンドを追加
version:'3.8'services:app:build: .
tty:truerestart: always
ports:- 8080:8080
volumes:- ./:/home/echo-hot-reload-test
command:- air
- コンテナ立ち上げ直し
- 再度
localhost:8080
を表示 → 「Hello, World!」であることを確認
$ docker compose build
$ docker compose up -d
server.go
- ホットリロードを試すため、適当な文字列に変更
- 再度
localhost:8080
を表示 → 「hogehoge」に変わっていることを確認 ヤッター
package main
import (
"net/http""github.com/labstack/echo/v4"
)
func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "hogehoge")
})
e.Logger.Fatal(e.Start(":8080"))
}
参考URL
おわりに