この記事では、GoプロジェクトにAirとDockerを利用してホットリロード機能を追加する手順を具体的に解説します。
1. プロジェクトの初期化
まずは、Goのプロジェクトを初期化します。
go mod init golang-backend
このコマンドを実行すると、go.mod
ファイルが作成され、モジュールが初期化されます。次に、エントリポイントとなる main.go
ファイルを作成します。
touch main.go
ファイルを作成したら、以下のように簡単なコードを記述してください。
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "This is golang-backend!")
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
動作確認をしましょう。
go run main.go
の入力後
curl localhost:8080
を叩くと
This is golang-backend!
という文字列が出力されれば成功です。
これでGoプロジェクトの初期化は完了です。
2. Dockerのセットアップ
Dockerfileの作成
Dockerを使用してGoの開発環境を構築するために、以下のような Dockerfile
を用意します。
FROM golang:1.23.1
WORKDIR /app
# ホットリロードツール Air をインストール
RUN go install github.com/cosmtrek/air@latest
# Air を使ってアプリケーションを起動
CMD ["air"]
Docker Compose ファイルの作成
次に、docker-compose.yml
または compose.yaml
を作成し、サービスを定義します。
services:
go:
build: .
ports:
- "8080:8080"
volumes:
- .:/app
3. Dockerのビルドと実行
以下のコマンドでDockerイメージをビルドし、コンテナを起動します。
docker compose up --build
しかし、この時点でホットリロードツール Air
のインストール時にエラーが発生しました。
go: github.com/cosmtrek/air@latest: version constraints conflict
これは、Air
のモジュール名が新しいバージョンで変更されたことによるエラーです。
4. エラーの解決
エラーを解決するために、Air
の特定バージョンをインストールするように変更しました。
RUN go install github.com/cosmtrek/air@v1.40.4
変更後、再度Dockerイメージをビルドします。
docker compose up --build
これで、無事にホットリロード機能が動作するコンテナが起動しました。
実際に変更を加えた場合の動作確認
ホットリロード環境が正しく動作しているかを確認するために、以下の手順を実施します。
1. main.go
ファイルに変更を加える
以下のように、main.go
ファイルの内容を変更します。
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, Go with Hot Reload!")
}
func main() {
http.HandleFunc("/", handler)
fmt.Println("Server started at :8080")
http.ListenAndServe(":8080", nil)
}
このコードは、HTTPサーバーを起動し、/
エンドポイントにアクセスするとメッセージを返す簡単なAPIです。
2. コンテナの再起動は不要
ホットリロード環境では、変更を加えた後に保存するだけで、Air
が自動的に変更を検知して再ビルドと再起動を行います。
3. 動作確認(curlコマンド)
変更が反映されていることを確認するために、別のターミナルから curl
コマンドを実行します。
curl http://localhost:8080
正常時のレスポンス
以下のレスポンスが返ってくれば、変更が正しく反映されていることを確認できます。
Hello, Go with Hot Reload!
4. 再度変更して確認
例えば、以下のようにレスポンスの内容をさらに変更します。
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, Go with Hot Reload! Updated!")
}
保存後、再び curl
コマンドを実行します。
curl http://localhost:8080
更新後のレスポンス
以下のように更新後のメッセージが反映されていれば、ホットリロードが正常に動作していることを確認できます。
Hello, Go with Hot Reload! Updated!
まとめ
以上の手順で、ホットリロードが正しく動作し、コード変更が即座に反映されることを確認しました。これにより、Goの開発効率を大幅に向上させることができます。Dockerを活用したホットリロード環境を、ぜひ活用してみてください!