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でリモートデバッグする方法
安定しないもののリモートデバッグも確認できたので書いておきます。
- realize.yaml切り替え
リモートデバッグの設定が記述されたyamlに切り替えます。$ mv .realize.yaml .realize.yaml.bk $ mv .realize.yaml.debug .realize.yaml
- docker-compose.yamlの
command
をコメントアウト
後述しますが安定しないので手動でrealizeを起動するようにしておきます。# command: realize start --run
- コンテナ再起動+realize実行
コンテナを再生成してrealizeを実行します。再生成されない場合はdocker-compose restart
など試してみてください。$ docker-compose up -d $ docker-compose exec api realize start --run
- Golandでデバッグ実行
GoLandの設定は以下の通りです。
あとはデバッグ実行するだけです。
リモートデバッグが安定しない
原因がわかりませんが、稀にリモートデバッグがうまくいかない時があります。
またリモートデバッグ中はホットリロードがうまく動作しないので、ソース変更後は再度デバッグ実行する必要があったりと、安定していません。
そういった時はrealize/デバッグの再実行、コンテナの再起動するとリモートデバッグ出来るようになります。
僕はログを埋めてデバッグすることが多いので深堀りしませんでしたが、多用される方は注意してください。