Dockerとechoでローカル開発環境を構築した際のメモ

 
              Web                          
 
Web

Dockerとechoでローカル開発環境を構築したので備忘がてら解説を残しておきたいと思います。

成果物

作成したソースコードは以下にあります。
https://github.com/shinjiezumi/echo-samples/tree/feature/create-app-on-docker

解説

Dockerfile

# 本番公開も見据えて、マルチステージビルドで作成
FROM golang:1.13.6 as build

RUN apt-get update && \
    apt-get install -y --no-install-recommends vim git

WORKDIR /go/src
COPY ./src /go/src

# ホットリロード対応のため`realize`を、リモートデバッグのために`dlv`をインストール
RUN go build -o api \
    && go get github.com/oxequa/realize \
    && go get -u github.com/go-delve/delve/cmd/dlv \
    && go build -o /go/bin/dlv github.com/go-delve/delve/cmd/dlv

docker-compose.yml

version: '3.5'

services:
  api:
    build:
      context: .
      dockerfile: docker/api/Dockerfile
      target: build # ビルド対象を指定
    depends_on:
      - db
    ports:
        - 8080:8080
        - 2345:2345 # リモートデバッグ用のポート
    security_opt: # リモートデバッグ用の設定
      - apparmor:unconfined
    cap_add: # リモートデバッグ用の設定
      - SYS_PTRACE
    volumes:
        - ./src:/go/src
    tty:
      true
    command: realize start --run
    environment:
      TZ: Asia/Tokyo
  db:
    build: docker/mysql
    ports:
      - 3306:3306
    volumes:
      - ./docker/mysql/data:/var/lib/mysql
      - ./docker/mysql/conf.d:/etc/mysql/conf.d
      - ./log/mysql:/var/log/mysql
    environment:
      MYSQL_DATABASE: sample
      MYSQL_ROOT_PASSWORD: root
      TZ: Asia/Tokyo

go.mod

最後のreplaceがかなり重要でこれがないとrealizeインストール時に以下のエラーが発生します。
この解決に結構時間掛かりました。。
module declares its path as: github.com/urfave/cli/v2 but was required as: gopkg.in/urfave/cli.v2

module github.com/shinjiezumi/echo-samples/src

go 1.13

require (
    github.com/labstack/echo v3.3.10+incompatible
    github.com/labstack/echo/v4 v4.1.15
)

# realizeインストールエラーの回避
replace gopkg.in/urfave/cli.v2 => github.com/urfave/cli/v2 v2.1.1

実行手順

READMEに記載の通りで、docker-compose up -dでイメージ作成〜コンテナ、アプリ起動します。

ソースを変更すると以下のように検知して再起動してくれます。

ホットリロードは開発効率がかなり上がるので導入しておきたいですよね。

api_1  | [20:50:56][SRC] : GO changed /go/src/main.go
api_1  | [20:50:56][SRC] : Install started
api_1  | [20:50:57][SRC] : Install completed in 1.091 s
api_1  | [20:50:57][SRC] : Running..
api_1  | [20:50:57][SRC] :    ____    __
api_1  | [20:50:57][SRC] :   / __/___/ /  ___
api_1  | [20:50:57][SRC] :  / _// __/ _ \/ _ \
api_1  | [20:50:57][SRC] : /___/\__/_//_/\___/ v4.1.15
api_1  | [20:50:57][SRC] : High performance, minimalist Go web framework
api_1  | [20:50:57][SRC] : https://echo.labstack.com
api_1  | [20:50:57][SRC] : ____________________________________O/_______
api_1  | [20:50:57][SRC] :                                     O\
api_1  | [20:50:57][SRC] : ��� http server started on [::]:8080

GoLandでリモートデバッグする方法

安定しないもののリモートデバッグも確認できたので書いておきます。

  1. realize.yaml切り替え
    リモートデバッグの設定が記述されたyamlに切り替えます。

    $ mv .realize.yaml .realize.yaml.bk
    $ mv .realize.yaml.debug .realize.yaml
  2. docker-compose.yamlのcommandをコメントアウト
    後述しますが安定しないので手動でrealizeを起動するようにしておきます。

    #    command: realize start --run
  3. コンテナ再起動+realize実行
    コンテナを再生成してrealizeを実行します。再生成されない場合はdocker-compose restartなど試してみてください。

    $ docker-compose up -d
    $ docker-compose exec api realize start --run
  4. Golandでデバッグ実行
    GoLandの設定は以下の通りです。

    あとはデバッグ実行するだけです。

リモートデバッグが安定しない

原因がわかりませんが、稀にリモートデバッグがうまくいかない時があります。

またリモートデバッグ中はホットリロードがうまく動作しないので、ソース変更後は再度デバッグ実行する必要があったりと、安定していません。

そういった時はrealize/デバッグの再実行、コンテナの再起動するとリモートデバッグ出来るようになります。

僕はログを埋めてデバッグすることが多いので深堀りしませんでしたが、多用される方は注意してください。

えず

東京でフリーランスのWebエンジニアやっています。 今はPHPとGoをメインに、プライベートでは広く浅くをモットーにフロント〜インフラまで学習しています。 当面の目標はDevOps寄りのオールラウンダー。

Web
スポンサーリンク
えずをフォローする
えずブログ