🐰
Dev Container 内で Go サーバーをホットリロードしながらデバッガをアタッチする (VSCode)
この記事では、VSCode
の Dev Container
で Go
サーバーを Air
でホットリロードさせながら、同時にデバッガをアタッチする方法を説明します。
Goのデバッガには Delve
を使用します。
前提条件
-
VSCode
がインストールされている -
VSCode
のDev Containers
拡張機能がインストールされている
手順
docker-compose.yml
の作成
1. version: '3.7'
services:
app:
container_name: go
build:
context: .
dockerfile: ./path/to/Dockerfile
volumes:
- .:/workspace:cached
ports:
- "18000:8080"
今回は Dev Container
内で開発するので、Delve
用にポートを開ける必要はありません。
Dockefile
の作成
1. 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"]
.air.toml
の設定
2. 以下のコマンドで .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
のデバッグ用サーバーを起動します。
launch.json
の作成
3. .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
Dev Container
に接続
2. VSCode のコマンドパレットから、Dev Containers: Open Folder in Container...
を選択し、workspace
ディレクトリを開きます。
3. デバッガをアタッチ
F5
を押して、デバッガをアタッチします。
4. ブレークポイントで止まることを確認
まとめ
Dev Container
ホットリロードしながらデバッグできるようになり、開発が快適になりました。
参考
Discussion