ディレクトリ構成
Goアプリケーションはapplicationディレクトリ以下にある。
*(アスタリスク)で囲んでいるファイルがポイント。
.
├── .vscode
│ └── **launch.json**
├── README.md
├── application
│ ├── **Dockerfile**
│ ├── controllers
│ ├── db
│ ├── go.mod
│ ├── go.sum
│ ├── main.go
│ ├── models
│ ├── server
│ ├── services
│ ├── **start.sh**
│ ├── tests
│ ├── tmp
│ └── vendor
├── **docker-compose.yml**
└── tmp
docker-compose
8080:8080はもともとあったアプリケーション用のport。
2345:2345をデバッガ用のportとして追記。
version: '3'
services:
api:
ports:
- 8080:8080
- 2345:2345
Dockerfile
FROM golang:1.16
WORKDIR /go/src/app/application
COPY go.mod ./
COPY go.sum ./
RUN go mod download
COPY . .
EXPOSE 8080
COPY start.sh /usr/local/bin/start.sh
RUN chmod 775 /usr/local/bin/start.sh
CMD ["start.sh"]
start.sh
DEBUG=dap DEBUG_PORT=2345 docker compose up -d
このコマンドでデバッグのためのコマンドを実行してくれる。
(環境変数によって処理を分岐)
コマンドの詳しい意味は参考記事を閲覧してください。
#!/bin/bash
# DEBUG=dap DEBUG_PORT=2345 docker compose up -d でリモート接続用コマンドを実行できる
if [ "${DEBUG}" = "dap" ];then
go build -gcflags='all=-N -l' -o app
dlv dap -l 0.0.0.0:${DEBUG_PORT} --log --check-go-version=false
elif [ "${DEBUG}" = "rpc" ]; then
dlv debug --continue --check-go-version=false --accept-multiclient --headless -l 0.0.0.0:${DEBUG_PORT} main.go
else
go run main.go
fi
launch.json
参考にした記事ほど複雑な設定をせずともデバッグを開始できました。
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${fileDirname}"
}
]
}
コンテナがしっかり立ち上がるまで待たないとビルドエラーみたいなのがでて混乱するので、コンテナ立ち上がり後はしっかり待つようにしたほうがいいです。(せっかちなので困惑しました)
参考記事