今回やりたかったこと
会社の同僚から以前作成していたアプリを配布するためのサイトをDocker上でリバースプロキシで接続できるようにしてくれ。ということで、なんとかサーバーを起動するまではできたのですが、Docker上でデバッグすることにはどうすればいいかわかりませんでした。
ということで、今回やりたかったことは、docker-composeでechoサーバーをDockerに立ち上げて、Remote Debugすることです。
docker-composeで複数のコンテナを管理したかったのですが、GolandのブログではDockerfileのRemote Debugの方法しかなかったので苦戦しました。
(成果物はGithubにアップしています。)
ディレクトリ構成
echo+MySQL+Nginx(リバースプロキシサーバー)の構築を想定しています。
#docker-compose.ymlの設定
ブログにあるように
–security-opt=”apparmor=unconfined” –cap-add=SYS_PTRACE
をdocker-compose.ymlに追加します。
デバッガに使用するdelveのために2345を公開します。
version: '3'
services:
db:
image: mysql:5.7
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: archive
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: user
MYSQL_PASSWORD: password
volumes:
- ./mysql/volumes:/var/lib/mysql
web:
build: ./go
privileged: true
ports:
- "9000"
- "2345:2345"
links:
- db
security_opt:
- apparmor:unconfined
cap_add:
- SYS_PTRACE
proxy:
build: ./proxy
ports:
- "80:80"
links:
- web
#GoのDockerfileの設定
必要なライブラリを取得して、delveを起動するように書きました。
(最後のコマンドが実行されても、サーバーは起動していない状態です。)
FROM golang:1.10
RUN go get github.com/labstack/echo
RUN go get github.com/labstack/echo/middleware
RUN go get github.com/derekparker/delve/cmd/dlv
COPY ./src /go/src
WORKDIR /go/src/app
RUN go build -gcflags "all=-N -l" -o /server app.go
CMD ["dlv", "--listen=:2345", "--headless=true", "--api-version=2", "exec", "/server"]
#GOPATHの設定
この設定にたどり着くのに数時間かかりました...。デフォルトの設定ではGlobal GOPATHに最初に設定したであろうGOPATHが設定されています。Project GOPATHに注目してください。2種類GOPATHが設定されています。
まず1つ目のGOPATHはDockerのgoコンテナのGOPATHである/go
に合わせたGOPATHです。これを設定することでブレイクポイントで止めることができるようになりました。
次に2つ目のGOPATHはGlobal GOPATHに設定されていたGOPATHです。これがないとコード補完が機能しなくなります。
#docker-compose up
echoのコンテナ、MySQLのコンテナ、nginxのコンテナが立ち上がった状態です。
#デバッグ
先程設定したデバッグの設定でDebugボタンを押します。
http://localhost/app/index
にアクセスしてブレイクポイントで止まったら成功です。