はじめに
Go言語のコンパイルをmulti stage buildで書けるようになったので、いちいちMakefileでクロスコンパイル記述を書く必要が無くなったということです。
MakefileでGo言語をコンパイルするのをdisる意図はないです
Makefileの場合
こんな感じのMakefileを書いてアレするのが普通だと思います。
build:
go build -o binary_hoge -v
build-linux:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bainary_hoge
Makefileを使いたくない理由
僕がCIツールで使っているCircleCIはビルド時の環境をコンテナイメージとして指定することができます。
これと併用する場合に、選択するイメージによってはmakeが入ってない場合があります。
CI上でmakeインストールすればいいんですが、下記の理由によりそれは選択したくないです。
- makeのインストールに地味に1分くらいかかる
- workflowでビルドを分割しているが、makeでやってることが多いと各ビルドでmakeインストールを書く必要ある
- makeをインストールしたコンテナイメージを作ればいいけど、イメージのメンテナンスは極力避けたい
docker-composeとmulti stage buildを使う
下記のようにdocker-compose.ymlとDockerfileを書きます。
docker-compose.yml
version: "3"
services:
app:
build: .
image: hogehoge-image
Dockerfile
FROM golang:alpine AS build-env
WORKDIR /work
RUN apk update && apk add git
ADD . /path-to-go-source/
RUN go build -o /work/api
FROM alpine
COPY --from=build-env /work/api ./api
EXPOSE 8080
ENTRYPOINT ./api
ビルドします。pushします。
docker-compose build
docker-compose push
まとめ
上記のようにすることで、docker multi stage buildでクロス、ローカルのdocker-machine向けのコンパイルが一括管理されるメリットを受けることができるようになります。
docker-machineを介さないローカルでの確認は今まで通り、Makefileを使えばいいかと思いますが、そもそもgo build hoge/
で済むならローカルでもMakefileはいらないんじゃないかと思います。
あくまで僕自身のニーズではそうでした。という話です。みなさん良いコンテナライフを〜
以上