Docker で Golang の開発環境を整えてみた

この記事は Docker Advent Calendar 2018 の21日目の記事です。

前日は jin_yokoyama さんの Elastic Stackで簡単!Dockerコンテナ監視ダッシュボード作成 でした!


f:id:zoe302:20181220220023p:plain

こんにちは、みなさん Docker 活用してますか?

私はもっぱら開発環境として Docker を利用しています。

普段業務では PHP を触ることが多いのですが、プライベートの開発では Go の開発などもやっています。

そこで今回は私が普段 Go の開発環境として使っているものをご紹介したいと思います。

コード

解説より先に実物を見たい方はこちら

github.com

解説

この開発環境では下記のようなディレクトリ構成になっています。

$ tree ./
./
├── Makefile
├── README.md
├── docker-compose.yml
├── go
│    ├── Dockerfile
│    ├── Makefile
│    └── main.go
└── run
    └── Dockerfile

./Makefile

このファイルは docker-compose のラッパーとして存在しています。Go をビルドして実行したいときには make up と実行するとまるっと実行してくれます。

./docker-compose.yml

今回の構成では Go のビルド用のコンテナと実行用のコンテナを分けています (multi-stage-build)。これらのコンテナを管理するために利用しています。

./go/

Go のビルドをするためのディレクトリ及び、Go のソースコードを管理しているディレクトリです。

./go/Dockerfile

Go のビルド用の Dockerfile です。

./go/Makefile

Go のコマンドのラッパーです。Dockerfile からのインターフェースとなるように設計しています。もともと Makefileコンパイルの自動化、依存解決に強いツールなので、Go のコンパイルととても相性が良いです。

./go/main.go

Go のコードです。今回は hello world するだけのコードを置いてます。

./run/

コンパイルした Go のバイナリファイルを設置して起動する用のディレクトリです。

./run/Dockerfile

ベースイメージは busybox を使って、multi-stage-build (COPY --from={image名}) を使ってビルドしたgoのバイナリファイルを取得して設置、実行しています。

利点

この設計にしておくことで run のコンテナイメージを共有することですぐに動く環境を共有することができ、かつベースイメージが busybox のためとても軽量で済みます。(今回の内容では3MBのイメージになりました!)

また、Go のコマンドを実行したい際には make run CMD='go fmt main' のようにすることで実行することができます。ファイルもマウントされているため、 go fmt で直ったものがホストマシンにも共有されます。

まとめ

Docker, Docker-Compose をうまく活用することで簡単に環境に左右されない開発環境を構築できるのはやっぱりとても楽ですね。

皆さんもこの機会にDockerで開発環境構築してみてはいかがでしょうか。