メインコンテンツまでスキップ

Docker Build Cloud

Docker Build Cloud とは

Docker Build Cloud は、Dockerイメージのビルドをクラウドにオフロードするマネージドビルダーサービスです。ローカルマシンやCI/CDエージェントのリソースを使わずに、Docker社のクラウドインフラ上でビルドを実行できます。

主な特徴

機能内容
高速ビルドクラウド上の専用ビルダーで実行。15〜20分のビルドが110秒になった事例も
共有キャッシュチームメンバー間でビルドキャッシュを共有。同じ依存関係を何度もダウンロードしない
マルチアーキテクチャビルドARM / AMD ビルダーをネイティブに搭載。エミュレーションなしで linux/amd64linux/arm64 を同時ビルド
並列ビルド複数ビルドを同時実行(Pro: 最大4件、Team/Business: 無制限)
きめ細かなキャッシングレイヤーキャッシュが無効でも有効な永続キャッシュマウント

CI/CDコスト削減

CI/CDエージェントのビルド時間が短縮されるため、高スペックエージェントを長時間稼働させるコストを削減できます。


管理画面(Overview)の見方

Docker Hub の Build Cloud > Overview ページでビルドの使用状況をモニタリングできます。期間を指定してフィルタリングすることも可能です。

Docker 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 の命令順序やレイヤー設計を最適化することで、このレートを向上させられます。

キャッシュ効率の改善

COPYRUN の順序を「変更頻度が低い命令を先に」記述することで、キャッシュヒット率が上がります。依存パッケージのインストール(npm install / dotnet restore)はソースコードの COPY より前に配置するのが基本です。


Azure DevOps での導入

GitHub Actions との違い

GitHub Actions では docker/setup-buildx-actiondocker-buildx プラグインのインストールを自動化しています。しかし Azure DevOps のホステッドエージェントにはこのアクションに相当するタスクが存在しないため、パイプラインのステップ内で docker-buildx CLI プラグインを手動インストールする必要があります。

前提条件

項目内容
Docker Hub アカウントBuild Cloud が有効なプラン(Pro / Team / Business)
Docker Hub PATread, write, delete スコープのパーソナルアクセストークン
Azure Container Registryビルド済みイメージのプッシュ先

パイプライン変数の設定

Azure DevOps のパイプライン変数(またはVariable Group)に以下を登録します。DOCKER_PAT は機密変数として保護してください。

変数名説明
DOCKER_PATDocker Hub PAT(機密変数)
DOCKER_ORGANIZATION_NAMEDocker Hub の組織名
DOCKER_USER_NAMEDocker Hub のユーザー名
DOCKER_BUILDER_NAMEBuild 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の稼働頻度によっては月末に向けて上限に近づくため、上限超過時に通常ビルドへ自動切り替えするフォールバックをパイプラインに組み込むことを推奨します。

プラン別のビルド分数上限は以下のとおりです。

プラン月次ビルド分数上限
Pro200分
Team500分
Business1,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)

関連リンク