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実行を含みます。