Go でアプリケーションを作ると、そのまま他になにもなくとも実行できるバイナリが出来あがります。この特性によりデプロイが大変楽です。
このような特性があるので、 Go を使う場合 Docker のようなオーケストレーションツールを使わなくても多くのサーバーにアプリをデプロイしていくことも可能かと思われますが、そこはまあ Docker という巨人に乗っておくと楽なことが多いです。具体的には swarm と docker-compose が便利なので Docker 上で実行したい。
ここで問題となってくるのが何も考えずに Docker イメージを作るとイメージサイズが膨れあがってしまってシングルバイナリによる手軽さなどが損なわれてしまうという点です。
たとえば golang:alpine のような比較的小さいイメージを使ってもファイルサイズはバイナリサイズ + 300MB ほどにもなってしまいます。 debian:jessie とかでも 120MB はあります。
これが一箇所の拠点にイメージを配信すればいいだけなら楽ですが、大陸をまたいでいたりすると 120MB だとか 300MB だとかを余計にダウンロードさせないといけないのは結構ストレスになります。
というわけで Go で作ったバイナリを実行できる最小限に近いコンテナの Dockerfile を書きました。
FROM alpine
RUN apk add --no-cache ca-certificates
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
これで実行できます。これだけなので Docker Hub とかには上げてません。これだとバイナリサイズ + 4MB ぐらいで済むのでデプロイが楽です。 FROM scratch してもっと頑張れば頑張れる可能性はありますが、まあこの程度でも十分でしょう。
glibc じゃないと困るとき便利そうなやつみつけた
https://github.com/frol/docker-alpine-glibc