0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DockerでGoプロジェクトにホットリロード機能を追加する方法

Posted at

この記事では、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を活用したホットリロード環境を、ぜひ活用してみてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?