Go
golang
echo
goland

GolandでDocker上のサーバーをRemote Debug

今回やりたかったこと

会社の同僚から以前作成していたアプリを配布するためのサイトをDocker上でリバースプロキシで接続できるようにしてくれ。ということで、なんとかサーバーを起動するまではできたのですが、Docker上でデバッグすることにはどうすればいいかわかりませんでした。

ということで、今回やりたかったことは、docker-composeでechoサーバーをDockerに立ち上げて、Remote Debugすることです。

docker-composeで複数のコンテナを管理したかったのですが、GolandのブログではDockerfileのRemote Debugの方法しかなかったので苦戦しました。

(成果物はGithubにアップしています。)

ディレクトリ構成

echo+MySQL+Nginx(リバースプロキシサーバー)の構築を想定しています。

スクリーンショット 2018-06-13 23.34.02.png

docker-compose.ymlの設定

ブログにあるように

–security-opt=”apparmor=unconfined” –cap-add=SYS_PTRACE

をdocker-compose.ymlに追加します。
デバッガに使用するdelveのために2345を公開します。

docker-compose.yml
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を起動するように書きました。
(最後のコマンドが実行されても、サーバーは起動していない状態です。)

Dockerfile
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"]

デバッグの設定

受話器を持ったゴーファーくんがかわいい。
スクリーンショット 2018-06-14 0.18.40.png

GOPATHの設定

この設定にたどり着くのに数時間かかりました...。デフォルトの設定ではGlobal GOPATHに最初に設定したであろうGOPATHが設定されています。Project GOPATHに注目してください。2種類GOPATHが設定されています。

まず1つ目のGOPATHはDockerのgoコンテナのGOPATHである/goに合わせたGOPATHです。これを設定することでブレイクポイントで止めることができるようになりました。

次に2つ目のGOPATHはGlobal GOPATHに設定されていたGOPATHです。これがないとコード補完が機能しなくなります。

スクリーンショット 2018-06-14 0.20.47.png

docker-compose up

echoのコンテナ、MySQLのコンテナ、nginxのコンテナが立ち上がった状態です。
スクリーンショット 2018-06-14 0.32.25.png

デバッグ

先程設定したデバッグの設定でDebugボタンを押します。
スクリーンショット 2018-06-14 0.35.16.png

http://localhost/app/index
にアクセスしてブレイクポイントで止まったら成功です。