はじめに
この記事は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ビルドしています。