Makefile
docker
MicroAdDay 21

dockerをbuildする際のMakefile

はじめに

この記事はMicroAd Advent Calendar 2017の21日目の記事です。

個人用でDockerイメージをビルドする場合はdockerhubに連携すればチョロで終わるんですが、仕事用だとプライベートレジストリにPushする必要があったり、タグを色々つけたりと何かと面倒が多いです。

ということで、ビルド手順をMakeでラップすることが多いのですが、そんなMakefileの一例のご紹介です。

Dokerfile

echoするだけの単純なDockerImageを前提に説明します。

FROM alpine:3.6

ENTRYPOINT ["/bin/echo"]

ARG GIT_REVISION=unkown
ARG GIT_ORIGIN=unkown
ARG IMAGE_NAME=unkown
LABEL git-revision=$GIT_REVISION \
      git-origin=$GIT_ORIGIN \
      image-name=$IMAGE_NAME

ARGとLABELをつかってビルド時に情報埋め込んでます。
イメージの出処をわかりやすくするのが目的です。LABELの値はロギング・ドライバを通じてfluentdに渡せるので、いつのリビジョンでなんのイメージのログか?という情報が集約した際にわかりやすくなります。
ちなみに、Docker公式ではラベルには自分達のドメインのFQDNの逆順に名前空間を切って命名すること推奨しているのですが、私の場合Hiveにログを突っ込むケースがあるため、カラム名=ラベル名にドットを入れたくないという事情があり、推奨とは反したラベル名にしています。

Makefile

NAME         := echo
REVISION     := $(shell git rev-parse --short HEAD)
ORIGIN       := $(shell git remote get-url origin)
TAGS         := $(REVISION)
RELEASE_TAGS := $(REVISION) 3.6 production
REGISTRY     := your.docker.registry.local
USER         := yourspace

.PHONY: build
build:
    docker build \
        --build-arg GIT_REVISION=$(REVISION) \
        --build-arg GIT_ORIGIN=$(ORIGIN) \
        --build-arg IMAGE_NAME=$(REGISTRY)/$(USER)/$(NAME) \
        $(addprefix -t $(REGISTRY)/$(USER)/$(NAME):,$(TAGS)) .

.PHONY: push
push:
    @for TAG in $(TAGS); do\
        docker push $(REGISTRY)/$(USER)/$(NAME):$$TAG; \
    done

.PHONY: release
release:
    @make build TAGS="$(RELEASE_TAGS)"
    @make push  TAGS="$(RELEASE_TAGS)"

MakefileではDockerで定義しているARGにビルド情報を渡しています。
また複数のタグをつけれるようにします。
gitのリビジョン、メインとなるミドルウェアのバージョン(3.6)、リリース用のエイリアス(production)でタグをつけることが多いです。
dockerのイメージタグをTAGSとRELEASE_TAGSで2箇所定義している理由としては、CI実行時においてテスト時はリビジョンタグのイメージのみをビルド、プッシュ、テストをして問題なければ、リリース時にリリース用のタグを諸々つけてビルド、プッシュする、みたいなのを実現するためです。

おわりに

以上、こんな感じでDockerビルドしています。