🗂

Visual Studio CodeでGoコンテナのデバッグとホットリロードを実現する方法

2025/02/06に公開

はじめに

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

./golang/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のポイントは、airdlvをインストールし、開発環境でのホットリロードとデバッグを両立させることです。

起動スクリプト

CMD ["air", "-c", ".air.toml"] では上手く動作しなかったため、シェルスクリプトを作成して起動します。

start.sh
#!/bin/sh
echo "Starting air with config .air.toml"
air -c .air.toml

このスクリプトによって、ホットリロードの設定をスムーズに実行できます。

ホットリロード設定

air の設定を変更して、コード変更時にコンパイルとデバッグの自動リロードを行います。

.air.toml
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のコンテナデバッグ環境を構築するには dlvair をインストール
  • Windows環境では launch.jsonsubstitutePath\ を使用
  • air を使ってホットリロードを実現し、コード変更時に自動でコンパイルとデバッグができるように設定
  • tasks.json でパスの確認を行い、設定ミスを防ぐ

Docker Desktopを使えばホットリロードが機能しているかを確認できます。

これで、GoコンテナのデバッグとホットリロードがVSCode上で快適に行えるようになりました!

適切な設定を行えば、開発効率が飛躍的に向上し、変更のたびに手動でコンパイルする手間が省けます。ぜひ、自身の環境に適用してみてください!

追記情報

DockerコンテナのGo言語デバッグで、ファイル名に大文字があると、ブレイクポイントが赤色にならずに、「unbound breakpoint」となることがわかりました。

Discussion