【備忘録】Dockerコンテナでgo+echo+airでホットリロードできることを目指す
環境
WindowsOS 11
wsl2 default distribution:Ubuntu
Docekr Desktop for Windows
ファイル構成
-hot_reload
|
*.air.toml
|
*-docker-compose.yml
|
*- Dockerfile
|
*- main.go
|
*- go.sum
|
*- go.mod
echoの導入
Dockerfile作成の前にgoのフレームワークである「echo」をインストールしておこう
以下のコマンドを実行してほしい
go get -u github.com/labstack/echo
Dockerfileの作成
先ずはDockerfileの作成だが、以下のコードをコピペして使用してほしい
FROM golang:1.18-alpine
RUN apk add --update && apk add git
WORKDIR /app
RUN go install github.com/cosmtrek/air@latest
COPY go.mod go.sum ./
RUN go mod download
CMD ["air","-c",".air.toml"]
EXPOSE 9090
docker-compose.ymlの実装
ここでは複数コンテナを一気に起動するときに便利なdocker-compose.ymlファイルを用いる。
(後々複数コンテナを用意するときのために)
実装は以下のようになる。
version: '3'
services:
app:
build: .
volumes:
- ./:/app
ports:
- "9090:9090"
main.goの実装
これまでと同様にコピペでOK
package main
import (
"net/http"
"github.com/labstack/echo"
)
func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello Air!")
})
e.Logger.Fatal(e.Start(":9090"))
}
起動したときに躓いたところ
さっそく実行してみた。いい感じに起動できたようだ。
しかし、一つ問題が生じてしまった。
そう、「air」のホットリロードが機能しないのである。なぜだ、、、
Dockerを使い始めてまだ日が浅かったので初歩の初歩で躓いていることに気づいていなかった。
「コードがwsl上にディレクトリ事マウントされているから、手元のコードをいくら変更したところで動くはずがない」
解決策
とりあえずの解決策として該当のコードがあるディレクトリでターミナルに
wsl
とコマンドを打ち込んで実行すると、/mnt/c/Users/{ユーザ名}/{プロジェクト名}となるので
ここでdockerを起動してあげるとホットリロードがきちんと機能することが分かった。
これ以外にもきっとスマートな別の方法があるかと思うので、こっちのほうが解決策としていいよーみたいなのがあればぜひ教えていただけると幸いです。
Discussion