🐰

Dev Container 内で Go サーバーをホットリロードしながらデバッガをアタッチする (VSCode)

2023/08/08に公開

この記事では、VSCodeDev ContainerGo サーバーを Air でホットリロードさせながら、同時にデバッガをアタッチする方法を説明します。

Goのデバッガには Delve を使用します。

前提条件

  • VSCode がインストールされている
  • VSCodeDev 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.tomlcmdfull_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 ホットリロードしながらデバッグできるようになり、開発が快適になりました。

参考

https://github.com/go-delve/delve/blob/master/Documentation/

https://github.com/cosmtrek/air

https://code.visualstudio.com/docs/editor/debugging

GitHubで編集を提案

Discussion