ダッシュで奪取

ゲーム、読書、人生

Go×Echoでホットリロードしたい

やりたいこと

  • 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: true
    restart: 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
  • Quick Start そのままの内容
  • ポート番号だけ変更した
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
  • Air インストール用のコマンドを追加
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
  • コンテナ内に入り、Air 用の設定ファイルを作成
$ 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: true
    restart: 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

おわりに

  • 更新がすぐ反映されるのはうれしい