🐰
Dev Container 内で Go サーバーをホットリロードしながらデバッガをアタッチする (VSCode)
この記事では、VSCode の Dev Container で Go サーバーを Air でホットリロードさせながら、同時にデバッガをアタッチする方法を説明します。
Goのデバッガには Delve を使用します。
前提条件
-
VSCodeがインストールされている -
VSCodeのDev Containers拡張機能がインストールされている
手順
1. docker-compose.yml の作成
version: '3.7'
services:
app:
container_name: go
build:
context: .
dockerfile: ./path/to/Dockerfile
volumes:
- .:/workspace:cached
ports:
- "18000:8080"
今回は Dev Container 内で開発するので、Delve 用にポートを開ける必要はありません。
1. Dockefile の作成
FROM golang:1.20.3
ENV GO111MODULE on
WORKDIR /workspace
# delve と Air をインストール
RUN go install github.com/go-delve/delve/cmd/dlv@latest && \
go install github.com/cosmtrek/air@latest
# ... (その他必要なツールをインストール)
# Air を起動
CMD ["air", "-c", ".air.toml"]
2. .air.toml の設定
以下のコマンドで .air.toml を生成します。
air init
生成された.air.toml の cmd と full_bin を以下のように編集します。
# ... (その他の設定)
[build]
cmd = "go build -gcflags=\"all=-N -l\" -o ./tmp/main ."
full_bin = "dlv --headless=true --listen=:40000 --api-version=2 --accept-multiclient exec --continue ./tmp/main"
cmd
Goのコードをビルドします。
-gcflags=\"all=-N -l\"ですべてのソースファイルに対して最適化を無効化することにより、delve がブレークポイントを認識できるようになります。
full_bin
delveのデバッグ用サーバーを起動します。
3. launch.json の作成
.vscode/launch.json を作成し、以下の内容を記述します。
{
"version": "0.2.0",
"configurations": [
{
"name": "Attach to Server",
"type": "go",
"request": "attach",
"mode": "remote",
"remotePath": "/workspace",
"port": 40000,
"host": "localhost",
"showLog": true
}
]
}
これで、F5 でデバッガをアタッチできるようになります。
動作確認
1. コンテナを起動
docker-compose up -d
2. Dev Container に接続
VSCode のコマンドパレットから、Dev Containers: Open Folder in Container... を選択し、workspace ディレクトリを開きます。

3. デバッガをアタッチ
F5 を押して、デバッガをアタッチします。
4. ブレークポイントで止まることを確認

まとめ
Dev Container ホットリロードしながらデバッグできるようになり、開発が快適になりました。
参考
Discussion