LoginSignup
0
2

More than 5 years have passed since last update.

Go言語でk8sならMakefileよりdocker-composeの方が便利かもしれない

Last updated at Posted at 2018-09-18

はじめに

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はいらないんじゃないかと思います。

あくまで僕自身のニーズではそうでした。という話です。みなさん良いコンテナライフを〜

以上

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2