🎃

【備忘録】Dockerコンテナでgo+echo+airでホットリロードできることを目指す

2022/11/16に公開

環境

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