GoLand + Docker + air + delve で快適な Golang Debug ライフ
みなさん。こんにちは 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においておきます
Air + Delve の インストールと設定
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起動
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"
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ではデフォルトでセキュリティやシステムコール呼び出しが抑制されているので、許可する
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