Docker ビルド&プッシュ Makefile

Dockerワークフロー用のMakefileを作成:imageのビルド、git SHAでのタグ付け、レジストリへのプッシュ、containerの実行、マルチステージビルドターゲット。

Docker

詳細な説明

MakeによるDocker自動化

Dockerコマンドは冗長で反復的です。Makefileはimage名、タグ、レジストリパスを標準化し、エラーを減らしてCI/CDパイプラインをシンプルにします。

バージョンタグ付け

IMAGE_NAME  ?= myapp
REGISTRY    ?= docker.io/myorg
GIT_SHA     := $(shell git rev-parse --short HEAD)
GIT_TAG     := $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
IMAGE_TAG   ?= $(GIT_TAG)
FULL_IMAGE  = $(REGISTRY)/$(IMAGE_NAME):$(IMAGE_TAG)
LATEST      = $(REGISTRY)/$(IMAGE_NAME):latest

Docker imageのバージョニングにgit SHAとタグを使用すると、コードコミットとデプロイされたimage間のトレーサビリティが生まれます。?=演算子によりCIシステムがタグを上書きできます:make push IMAGE_TAG=v1.2.3

ビルドターゲット

build:
	docker build \
	  --build-arg GIT_SHA=$(GIT_SHA) \
	  --build-arg BUILD_TIME=$(shell date -u +%Y-%m-%dT%H:%M:%SZ) \
	  -t $(FULL_IMAGE) \
	  -t $(LATEST) \
	  -f Dockerfile .

build-no-cache:
	docker build --no-cache -t $(FULL_IMAGE) -f Dockerfile .

ビルド引数はメタデータをimageに注入します。複数行コマンドはバックスラッシュ継続を使用して読みやすくしています。

プッシュとデプロイ

push: build
	docker push $(FULL_IMAGE)
	docker push $(LATEST)

run:
	docker run --rm -it -p 8080:8080 $(FULL_IMAGE)

stop:
	docker stop $$(docker ps -q --filter ancestor=$(FULL_IMAGE)) 2>/dev/null || true

stopターゲットの$$に注意してください。これはドルサインをエスケープして、Makeが$(...)をMake変数として展開する代わりに、コマンド置換としてシェルに渡します。

マルチプラットフォームビルド

build-multi:
	docker buildx build \
	  --platform linux/amd64,linux/arm64 \
	  -t $(FULL_IMAGE) \
	  --push .

Docker Buildxはマルチアーキテクチャimageをサポートします。--pushフラグはビルド後に直接プッシュします。

重要なポイント

  • 常に特定のバージョンとlatestの両方でタグ付けする
  • Dockerfileを変更せずにビルドメタデータを注入するには--build-argを使用する
  • || trueパターンはcontainerが実行されていない場合にMakeが失敗するのを防止する

ユースケース

マイクロサービスのDocker imageビルドを管理する場合。gitからの自動タグ付け、containerレジストリへのプッシュ、テスト用のローカルでのcontainer実行を含みます。

試してみる — Makefile Generator

フルツールを開く