Visual Studio CodeでGoコンテナのデバッグとホットリロードを実現する方法
はじめに
Windows環境でフォルダ構成が複雑な状況でも、Visual Studio Code (VSCode)を用いてGoのコンテナデバッグとホットリロードを実現できるようになりました。設定にはかなり苦労しましたが、その過程と設定手順を詳しく解説します。
開発環境をスムーズに構築するためには、適切なフォルダ構成、Dockerの設定、ホットリロードの設定、そしてVSCodeでのデバッグ設定が重要です。本記事では、それぞれのポイントを順を追って説明します。
フォルダ構成
プロジェクトのフォルダ構成は以下のようになっています。
$ tree
.
├── .vscode
│ ├── launch.json
│ └── tasks.json
├── docker-compose.yaml
├── golang
│ ├── .env
│ ├── Dockerfile
│ ├── Makefile
│ ├── host.json
│ └── src
│ ├── .air.toml
│ ├── go.mod
│ ├── go.sum
│ ├── main.go
│ ├── my-net.json
│ ├── mysql.go
│ └── start.sh
├── mysql
└── nginx
デバッグ用Goコンテナの作成
Goコンテナ内でデバッグを行うために、dlv
(Delve)とair
(ホットリロードツール)をインストールする必要があります。ソースファイルはマウントし、air
で起動する設定を行います。
Dockerfile
FROM golang
WORKDIR /usr/src/app
# 必要なツールをインストール
RUN apt update && apt install -y net-tools && go install github.com/air-verse/air@latest && go install github.com/go-delve/delve/cmd/dlv@latest
# ソースコードをコンテナにコピー
COPY ./src ./
# Goのライブラリをインストール
RUN go mod download && go mod verify
# コンテナ起動時に実行するスクリプトを設定
RUN chmod +x ./start.sh
ENTRYPOINT ["./start.sh"]
このDockerfileのポイントは、air
とdlv
をインストールし、開発環境でのホットリロードとデバッグを両立させることです。
起動スクリプト
CMD ["air", "-c", ".air.toml"]
では上手く動作しなかったため、シェルスクリプトを作成して起動します。
#!/bin/sh
echo "Starting air with config .air.toml"
air -c .air.toml
このスクリプトによって、ホットリロードの設定をスムーズに実行できます。
ホットリロード設定
air
の設定を変更して、コード変更時にコンパイルとデバッグの自動リロードを行います。
root = "."
testdata_dir = "testdata"
tmp_dir = "tmp"
[build]
bin = "./bin/myapp"
cmd = "go build -gcflags="all=-N -l" -o ./bin/myapp ."
exclude_dir = ["assets", "tmp", "vendor", "testdata", "bin"]
full_bin = "dlv --headless=true --listen=:2345 --api-version=2 --accept-multiclient exec --continue ./bin/myapp"
poll = true
poll_interval = 1000
-
bin
: コンパイル後のバイナリを格納する場所 -
cmd
: コンパイル時のコマンド (-N -l
は最適化を無効化しデバッグしやすくする) -
poll
: Windows環境のためポーリング設定を有効化 (1秒ごとにソースを監視) -
full_bin
: デバッグ実行時のコマンド (dlv
を用いたデバッグサーバの起動)
コンテナ単体で起動する場合のコマンド
docker run -it --rm -v $(CURDIR)/src:/usr/src/app -w /usr/src/app \
-p 4567:4567 -p 2345:2345 \
--name golang-d --net my-net golang_console:dockerfile bash
このコマンドを使えば、手動でコンテナを起動して動作確認を行うことができます。
実行
ホットリロードがが出来ているかどうかなど、コンテナの状況はDocker Desktopから簡単に確認できます。
デバッグの状況は下記のような感じです。
まとめ
- Goのコンテナデバッグ環境を構築するには
dlv
とair
をインストール - Windows環境では
launch.json
のsubstitutePath
に\
を使用 -
air
を使ってホットリロードを実現し、コード変更時に自動でコンパイルとデバッグができるように設定 -
tasks.json
でパスの確認を行い、設定ミスを防ぐ
Docker Desktopを使えばホットリロードが機能しているかを確認できます。
これで、GoコンテナのデバッグとホットリロードがVSCode上で快適に行えるようになりました!
適切な設定を行えば、開発効率が飛躍的に向上し、変更のたびに手動でコンパイルする手間が省けます。ぜひ、自身の環境に適用してみてください!
追記情報
DockerコンテナのGo言語デバッグで、ファイル名に大文字があると、ブレイクポイントが赤色にならずに、「unbound breakpoint」となることがわかりました。
Discussion