Docker Build Cloud
Docker Build Cloud とは
Docker Build Cloud は、Dockerイメージのビルドをクラウドにオフロードするマネージドビルダーサービスです。ローカルマシンやCI/CDエージェントのリソースを使わずに、Docker社のクラウドインフラ上でビルドを実行できます。
主な特徴
| 機能 | 内容 |
|---|---|
| 高速ビルド | クラウド上の専用ビルダーで実行。15〜20分のビルドが110秒になった事例も |
| 共有キャッシュ | チームメンバー間でビルドキャッシュを共有。同じ依存関係を何度もダウンロードしない |
| マルチアーキテクチャビルド | ARM / AMD ビルダーをネイティブに搭載。エミュレーションなしで linux/amd64 と linux/arm64 を同時ビルド |
| 並列ビルド | 複数ビルドを同時実行(Pro: 最大4件、Team/Business: 無制限) |
| きめ細かなキャッシング | レイヤーキャッシュが無効でも有効な永続キャッシュマウント |
CI/CDコスト削減
CI/CDエージェントのビルド時間が短縮されるため、高スペックエージェントを長時間稼働させるコストを削減できます。
管理画面(Overview)の見方
Docker Hub の Build Cloud > Overview ページでビルドの使用状況をモニタリングできます。期間を指定してフィルタリングすることも可能です。

BUILD MINUTES(左パネル)
| 指標 | 内容 |
|---|---|
| Total Minutes Used | 期間中に消費したビルド分数の合計 |
| Total Builds Completed | 期間中に完了したビルド数 |
| Minutes Used Over Time | 日別のビルド分数の推移(棒グラフ) |
棒グラフにより、CI/CDの稼働パターンやビルド量のピーク日が一目でわかります。デプロイ頻度の変化やスパイクの原因調査に活用できます。
BUILD CACHE USAGE(右パネル)
| 指標 | 内容 |
|---|---|
| Estimated Time Saved | キャッシュ再利用によって節約できた推定ビルド時間の合計 |
| Cache Re-usage(ゲージ) | 全ビルドにおけるキャッシュ再利用率(%) |
ゲージは2色で構成されます。
| 色 | 意味 |
|---|---|
| 濃青(Pulled from cache) | キャッシュから取得したビルドステップの割合 |
| 薄青(Built from scratch) | キャッシュが効かずゼロからビルドした割合 |
Cache re-use rate が高いほど効果的です。Dockerfile の命令順序やレイヤー設計を最適化することで、このレートを向上させられます。
COPY や RUN の順序を「変更頻度が低い命令を先に」記述することで、キャッシュヒット率が上がります。依存パッケージのインストール(npm install / dotnet restore)はソースコードの COPY より前に配置するのが基本です。
Azure DevOps での導入
GitHub Actions との違い
GitHub Actions では docker/setup-buildx-action が docker-buildx プラグインのインストールを自動化しています。しかし Azure DevOps のホステッドエージェントにはこのアクションに相当するタスクが存在しないため、パイプラインのステップ内で docker-buildx CLI プラグインを手動インストールする必要があります。
前提条件
| 項目 | 内容 |
|---|---|
| Docker Hub アカウント | Build Cloud が有効なプラン(Pro / Team / Business) |
| Docker Hub PAT | read, write, delete スコープのパーソナルアクセストークン |
| Azure Container Registry | ビルド済みイメージのプッシュ先 |
パイプライン変数の設定
Azure DevOps のパイプライン変数(またはVariable Group)に以下を登録します。DOCKER_PAT は機密変数として保護してください。
| 変数名 | 説明 |
|---|---|
DOCKER_PAT | Docker Hub PAT(機密変数) |
DOCKER_ORGANIZATION_NAME | Docker Hub の組織名 |
DOCKER_USER_NAME | Docker Hub のユーザー名 |
DOCKER_BUILDER_NAME | Build Cloud で作成したビルダー名 |
テンプレートステップの実装
以下は再利用可能なステップテンプレート(templates/steps/docker-buildx-build-and-push-template.yml)の例です。
parameters:
- name: DOCKER_PAT
type: string
- name: DOCKER_ORGANIZATION_NAME
type: string
- name: DOCKER_USER_NAME
type: string
- name: DOCKER_BUILDER_NAME
type: string
- name: serviceName
type: string
- name: azureSubscription
type: string
- name: azureContainerRegistryName
type: string
- name: tag
type: string
steps:
# Step 1: docker-buildx プラグインを手動インストールし、Build Cloud ビルダーを作成
- task: CmdLine@2
displayName: Setup Docker Build Cloud
inputs:
script: |
ARCH=amd64
mkdir -p ~/.docker/cli-plugins
# docker/actions-toolkit の最新リリース一覧から linux-amd64 バイナリの URL を取得
BUILDX_URL=$(curl -s https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-lab-releases.json \
| jq -r ".latest.assets[] | select(endswith(\"linux-$ARCH\"))")
curl --silent -L --output ~/.docker/cli-plugins/docker-buildx $BUILDX_URL
chmod a+x ~/.docker/cli-plugins/docker-buildx
# Docker Hub に PAT でログインして Build Cloud を利用可能にする
echo "${{ parameters.DOCKER_PAT }}" | docker login \
--username ${{ parameters.DOCKER_USER_NAME }} --password-stdin
# クラウドビルダーを作成(ドライバー: cloud)
docker buildx create \
--driver cloud \
${{ parameters.DOCKER_ORGANIZATION_NAME }}/${{ parameters.DOCKER_BUILDER_NAME }}
# Step 2: ACR にログインしてイメージをビルド&プッシュ
- task: AzureCLI@2
displayName: Build and push ${{ parameters.serviceName }} docker image
inputs:
azureSubscription: '${{ parameters.azureSubscription }}'
scriptType: bash
scriptLocation: inlineScript
inlineScript: |
az acr login --name ${{ parameters.azureContainerRegistryName }}
# ビルダー名は "cloud-<org>-<builder>" の形式になる
docker buildx build \
--builder cloud-${{ parameters.DOCKER_ORGANIZATION_NAME }}-${{ parameters.DOCKER_BUILDER_NAME }} \
-f $(Build.Repository.LocalPath)/${{ parameters.serviceName }}/Dockerfile \
-t ${{ parameters.azureContainerRegistryName }}.azurecr.io/${{ parameters.serviceName }}:${{ parameters.tag }} \
$(Build.Repository.LocalPath)
docker push \
${{ parameters.azureContainerRegistryName }}.azurecr.io/${{ parameters.serviceName }}:${{ parameters.tag }}
ポイント解説
docker-buildx の手動インストール
BUILDX_URL=$(curl -s https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-lab-releases.json \
| jq -r ".latest.assets[] | select(endswith(\"linux-$ARCH\"))")
curl --silent -L --output ~/.docker/cli-plugins/docker-buildx $BUILDX_URL
chmod a+x ~/.docker/cli-plugins/docker-buildx
- GitHub Actions の
docker/setup-buildx-actionは内部でこれと同等の処理を行っています - Azure DevOps ではそれに相当するタスクがないため、
CmdLine@2タスク内で自前インストールします - バイナリは
~/.docker/cli-plugins/に配置し、実行権限を付与します docker/actions-toolkitリポジトリのリリース JSON から常に最新の Build Cloud 対応 buildx を取得します
ビルダーの命名規則
docker buildx create --driver cloud <org>/<builder> で作成したビルダーは、ビルド時に以下の名前で参照します。
cloud-<DOCKER_ORGANIZATION_NAME>-<DOCKER_BUILDER_NAME>
Docker Hub ログインが必要な理由
Build Cloud のビルダーは Docker Hub アカウントに紐づいています。docker login で認証することで、クラウドビルダーへのアクセス権が付与されます。ACR へのログインは別途 az acr login で行います。
ビルド分数の上限とフォールバック
Business プランのビルド分数は 月1,500分 が上限です。上限を超えると docker buildx build がエラーで失敗し、パイプライン全体が停止します。CI/CDの稼働頻度によっては月末に向けて上限に近づくため、上限超過時に通常ビルドへ自動切り替えするフォールバックをパイプラインに組み込むことを推奨します。
プラン別のビルド分数上限は以下のとおりです。
| プラン | 月次ビルド分数上限 |
|---|---|
| Pro | 200分 |
| Team | 500分 |
| Business | 1,500分 |
フォールバック実装パターン
Build Cloud でのビルドが失敗した場合に、エージェント上のローカルビルダー(標準の docker build)へ自動フォールバックするパターンです。
- task: AzureCLI@2
displayName: Build and push ${{ parameters.serviceName }} docker image
inputs:
azureSubscription: '${{ parameters.azureSubscription }}'
scriptType: bash
scriptLocation: inlineScript
inlineScript: |
az acr login --name ${{ parameters.azureContainerRegistryName }}
IMAGE=${{ parameters.azureContainerRegistryName }}.azurecr.io/${{ parameters.serviceName }}:${{ parameters.tag }}
DOCKERFILE=$(Build.Repository.LocalPath)/${{ parameters.serviceName }}/Dockerfile
CONTEXT=$(Build.Repository.LocalPath)
# Build Cloud でビルドを試みる。失敗時はローカルビルドにフォールバック
if docker buildx build \
--builder cloud-${{ parameters.DOCKER_ORGANIZATION_NAME }}-${{ parameters.DOCKER_BUILDER_NAME }} \
-f $DOCKERFILE -t $IMAGE $CONTEXT; then
echo "##[section]Build Cloud build succeeded."
else
echo "##[warning]Build Cloud build failed (quota exceeded or unavailable). Falling back to local build."
docker build -f $DOCKERFILE -t $IMAGE $CONTEXT
fi
docker push $IMAGE
フォールバック時の挙動
| 状況 | 動作 |
|---|---|
| Build Cloud 成功 | クラウドビルダーでビルド → ACR へプッシュ |
| Build Cloud 失敗(上限超過・障害等) | エージェント上でローカルビルド → ACR へプッシュ |
docker pushはどちらのパスでも同じイメージタグに対して実行されるため、後続のデプロイ処理を変更する必要はありません##[warning]ログを出力することで、Azure DevOps のパイプラインログ上でフォールバック発生を視覚的に確認できます- フォールバック発生が続く場合は管理画面の Total Minutes Used を確認し、上限引き上げや不要ビルドの削減を検討してください
呼び出し元パイプラインの例
- template: templates/steps/docker-buildx-build-and-push-template.yml
parameters:
DOCKER_PAT: $(DOCKER_PAT)
DOCKER_ORGANIZATION_NAME: $(DOCKER_ORGANIZATION_NAME)
DOCKER_USER_NAME: $(DOCKER_USER_NAME)
DOCKER_BUILDER_NAME: $(DOCKER_BUILDER_NAME)
serviceName: my-api
azureSubscription: my-azure-service-connection
azureContainerRegistryName: myregistry
tag: $(Build.BuildId)