🐳

GoLand + Docker + air + delve で快適な Golang Debug ライフ

2023/08/10に公開

みなさん。こんにちは Shun.PeAce です
最近はよくGoでも開発しているんですが。。。IDEはJetBrains(GoLand)を愛用させてもらってます
なんだかんだでJetBrainsのIDEを10年近く愛用しています
Dockerの環境でDebugをどうしようか考えていたときに、Delveと出会ったので、GoLand + Docker + air + delve のデバック設定についてまとめておこうと思います。
これをするまではPrintDebugに頼ってました…PrintDebugさらば!ということで備忘録的に書いていきます!

air : https://github.com/cosmtrek/air
delve : https://github.com/derekparker/delve

環境

Mac Book Pro : M1
Docker Desktop 4.22.0
Docker Engine 24.0.5
Go 1.20.0
GoLand 2023.1.2

App作成

本来は業務で利用しているアプリケーションを対象としますがメモとして自分でアプリケーションたてます

-> % tree 
.
├── Dockerfile
├── app
│   ├── extension
│   │   └── extension.go
│   ├── go.mod
│   └── main.go
├── docker-compose.yaml
└── go.mod

構成はこんなかんじ
サンプルコードはGithubにおいておきます
https://github.com/smpeotn/go-debug-sample

Air + Delve の インストールと設定

Dockerfile(抜粋)
Run go mod tidy && \
	go install github.com/cosmtrek/air@latest && \ # air install
	go install github.com/go-delve/delve/cmd/dlv@latest # delve install

CMD ["air","-c",".air.toml"] # air起動
.air.toml(抜粋)
cmd = "go build -o ./tmp/server ."
# Binary file yields from `cmd`.
bin = "./tmp/server"
# Customize binary.
full_bin = "APP_USER=air dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec --continue ./tmp/server"
docker-compose.yaml
version: "3"
services:
  web:
    build: .
    tty: true
    ports:
      - "8080:8080"
      - "2345:2345" # delveと通信するためのポート
    volumes:
      - ./app:/go/src/app
   security_opt: 
      - apparmor:unconfined
   cap_add:
      - SYS_PTRACE      

security_opt / cap_add 大事
dockerではデフォルトでセキュリティやシステムコール呼び出しが抑制されているので、許可する
https://docs.docker.com/engine/security/apparmor/

docker-composeで起動するとAirとDelve(API server listening at ..:2345)が起動している

2023-08-10 19:25:50 
2023-08-10 19:25:50   __    _   ___  
2023-08-10 19:25:50  / /\  | | | |_) 
2023-08-10 19:25:50 /_/--\ |_| |_| \_ , built with Go 
2023-08-10 19:25:50 
2023-08-10 19:25:50 watching .
2023-08-10 19:25:50 watching extension
2023-08-10 19:25:50 !exclude tmp
2023-08-10 19:25:50 building...
2023-08-10 19:25:50 running...
2023-08-10 19:25:50 API server listening at: [::]:2345
2023-08-10 19:25:50 2023-08-10T19:25:50+09:00 warning layer=rpc Listening for remote connections (connections are not authenticated nor encrypted)

GoLand の設定

実行 > 実行構成の編集 or 画面右上 構成の追加

実行/デバッグ構成 画面が表示される
左上の 「+」 から 「Goリモート」 を選択

  • 名前: 構成名(フリーテキスト)
  • ホスト: localhost
  • ポート: 2345
    • 前に設定したdelveの待ち受けポート
  • 切断時: 実行中のままにする
    • これやらないと、DebugStopしたときにdelveのConnectionが切れて立ち上げ直しが必要
  • OKで保存


ブレイクポイントを貼って


右上の構成ボックスに↑で保存したリモートデバック設定が表示されるので
選択した状態で 「バグ」マーク を 押して デバッグスタート!

ブラウザで http://localhost:8080/foobarbaz
にアクセスすると

ちゃんと止まってくれます!
あとはデバッグしまくる!

まとめ

意外とすんなりできました。
Airのtomlファイルのdelveの起動コマンドの書き方で苦労した場面もありましたが
(docker-composeのhelthcheckとか入ってるとまたややこしい...
まずは、シンプルに始めてみようかなと思ってまとめました。きっと開発の環境が変わったときとかにまた忘れるから…

最後まで読んでいただきありがとうございました!

Discussion