[GO][Docker][Air]windows10のDocker環境でAirホットリロードが動かない問題を解決する方法

[GO][Docker][Air]windows10のDocker環境でAirホットリロードが動かない問題を解決する方法
Photo by aisvri / Unsplash

 Goの開発環境を整えていたのですが、Airを利用したホットリロードが効かないため不便していました。いくつか記事を試してみても解決しませんでしたが、Gihubを眺めていたところ同様の問題にハマっている人を発見し、そのIssue通りに設定すると解決できました。。

環境

  1. Windows10
  2. Dokcer
    1. 24.0.6
  3. Go
    1. go1.21.5
  4. Air
    1. 1.49.0

現象

Docker DesktopのLogsでは、Airの情報が表示され、building...からrunning...と一見正常に読み込みがされている模様。しかし、ファイルを変更しても再ビルドが実施されず、変更内容が適用されない。コンテナを再起動すれば変更が適用されている。

正常に起動している

解決方法

Airの以下Issueを参考に、.air.tomlのbuildセクションに「poll = true」を設定する。

air started but NOT reloading · Issue #274 · cosmtrek/air
It seems to be working, but there’s no rebuilding after I change the code. Dockerfile: FROM golang:alpine RUN apk add --no-cache git WORKDIR /app COPY go.* . COPY *air.toml . RUN go mod download CO…

実際の.air.toml

# Config file for [Air](https://github.com/cosmtrek/air) in TOML format

# Working directory
# . or absolute path, please note that the directories following must be under root.
root = "."
tmp_dir = "tmp"

[build]
# Just plain old shell command. You could use `make` as well.
cmd = "go build -o ./tmp/main ./main.go"
# Binary file yields from `cmd`.
bin = "tmp/main"
# Customize binary.
full_bin = "APP_ENV=dev APP_USER=air ./tmp/main"
# Watch these filename extensions.
include_ext = ["go", "tpl", "tmpl", "html"]
# Ignore these filename extensions or directories.
exclude_dir = ["assets", "tmp", "vendor", "frontend/node_modules", "docker"]
# Watch these directories if you specified.
include_dir = []
# Exclude files.
exclude_file = []
# Exclude unchanged files.
exclude_unchanged = true
# This log file places in your tmp_dir.
log = "air.log"
# It's not necessary to trigger build each time file changes if it's too frequent.
delay = 1000 # ms
# Stop running old binary when build errors occur.
stop_on_error = true
# Send Interrupt signal before killing process (windows does not support this feature)
send_interrupt = false
# Delay after sending Interrupt signal
kill_delay = 500 # ms
# For Windows10 Setting 追記箇所
poll = true

[log]
# Show log time
time = false

[color]
# Customize each part's color. If no color found, use the raw app log.
main = "magenta"
watcher = "cyan"
build = "yellow"
runner = "green"

[misc]
# Delete tmp directory on exit
clean_on_exit = true