Docker Hub のコンテナ イメージを使用して、Cloud Build でタスクを実行できます。また、ビルドで作成したイメージを Docker Hub に push できます。このページでは、Docker Hub イメージの push と pull を行うようにビルド構成ファイルを記述する方法について説明します。ビルド構成ファイルで使用できるフィールドの概要については、ビルド構成の概要をご覧ください。
Docker Hub から一般公開のイメージを pull する
Docker Hub に格納されている公式の Docker イメージ、Docker 認定イメージ、カスタム イメージをビルドステップで pull するには、name
フィールドにイメージの名前を指定します。Cloud Build は、指定されたイメージを先に Docker Hub から pull し、そのイメージを使用してビルドステップを実行します。
次の例では、Cloud Build は maven
の Docker イメージを pull し、args
に指定された mvn
コマンドを実行します。
YAML
steps:
- name: "maven"
args: ["mvn", "--version"]
JSON
{
"steps": [
{
"name": "maven",
"args": [
"mvn",
"--version"
]
}
]
}
Secret Manager に Docker 認証情報を保存する
限定公開のイメージを pull し、一般公開のイメージと限定公開のイメージを Docker Hub に push するには、Cloud Build が認証情報を使用して Docker に対して認証する必要があります。ビルドに Docker 認証情報を含めるには、まずシークレットを Secret Manager に保存してから、Cloud Build に Secret Manager からシークレットにアクセスする権限を付与する必要があります。
Docker 認証情報を Secret Manager に保存するには:
Cloud Console の [Secret Manager] ページに移動します。
[シークレット マネージャー] ページで、[シークレットを作成] をクリックします。
[シークレットの作成] ページの [名前] に「
docker-username
」と入力します。[シークレットの値] フィールドに、Docker のユーザー名を入力します。
[リージョン] セクションは変更しません。
[シークレットを作成] ボタンをクリックします。
上記の手順を繰り返して、Docker のパスワードを Secret Manager に保存します。
ビルドに使用するサービス アカウントに、シークレットの Secret Manager のシークレット アクセサーの IAM ロールを付与するには:
Google Cloud コンソールで [シークレット マネージャー] ページを開きます。
Docker のユーザー名とパスワードに対応するシークレットのチェックボックスをオンにします。
まだ開いていない場合は、[情報パネルを表示] をクリックしてパネルを開きます。
パネルの [権限] で、[プリンシパルを追加] をクリックします。
[新しいプリンシパル] フィールドに、サービス アカウントのメールアドレスを入力します。
[ロールを選択] プルダウン ボックスで、[Secret Manager のシークレット アクセサー] のロールを選択します。
[保存] をクリックします。
Docker Hub から限定公開のイメージを pull する
Docker Hub から限定公開のイメージを pull するには:
Secret Manager に Docker 認証情報が保存されていて、Cloud Build にシークレットにアクセスする権限が付与されていることを確認します。
ビルド構成ファイルで、次のことを行います。
- すべてのビルド
steps
の後に、シークレットのバージョンと Docker のユーザー名とパスワードの環境変数を指定するavailableSecrets
フィールドを追加します。 - ユーザー名とパスワードを指定するビルドステップで、次のようにします。
- ビルドステップで bash ツールを使用するには、
bash
を指すentrypoint
フィールドを追加します。これは、シークレットの環境変数を参照するために必要です。 - ユーザー名とパスワードの環境変数を指定する
secretEnv
フィールドを追加します。 args
フィールドに、最初の引数として-c
フラグを追加します。-c の後に渡した文字列はすべてコマンドとして扱われます。-c で bash コマンドを実行する方法の詳細については、bash のドキュメントをご覧ください。args
フィールドにシークレットを指定する場合は、$$
を接頭辞とする環境変数を使用して指定します。
- ビルドステップで bash ツールを使用するには、
次のビルド構成ファイルは、Secret Manager に保存されている Docker のユーザー名とパスワードを使用して Docker にログインし、非公開イメージを実行する方法を示しています。
YAML
steps: - name: 'gcr.io/cloud-builders/docker' entrypoint: 'bash' args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD'] secretEnv: ['USERNAME', 'PASSWORD'] - name: "gcr.io/cloud-builders/docker" entrypoint: 'bash' args: ['-c', 'docker run $$USERNAME/REPOSITORY:TAG'] secretEnv: ['USERNAME'] availableSecrets: secretManager: - versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION env: 'PASSWORD' - versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION env: 'USERNAME'
JSON
{ "steps": [ { "name": "gcr.io/cloud-builders/docker", "entrypoint": "bash", "args": [ "-c", "docker login --username=$$USERNAME --password=$$PASSWORD" ], "secretEnv": [ "USERNAME", "PASSWORD" ] }, { "name": "gcr.io/cloud-builders/docker", "entrypoint": "bash", "args": [ "-c", "docker run $$USERNAME/REPOSITORY:TAG" ], "secretEnv": [ "USERNAME" ] } ], "availableSecrets": { "secretManager": [{ "versionName": "projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION", "env": "PASSWORD" }, { "versionName": "projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION", "env": "USERNAME" }] } }
上記のコマンドのプレースホルダ値を次のように置き換えます。
PROJECT_ID
: シークレットを保存している Google Cloud プロジェクトの ID。DOCKER_USERNAME_SECRET_NAME
: Docker ユーザー名に対応するシークレット名。DOCKER_USERNAME_SECRET_VERSION
: Docker ユーザー名のシークレット バージョン。DOCKER_PASSWORD_SECRET_NAME
: Docker パスワードに対応するシークレット名。DOCKER_PASSWORD_SECRET_VERSION
: Docker パスワードのシークレット バージョン。REPOSITORY
: イメージを pull する Docker リポジトリの名前。TAG
: イメージのタグ名。
- すべてのビルド
ビルド構成ファイルを使用して、ビルドを手動で開始するか、トリガーを使用してビルドを自動化します。
イメージを Docker Hub に push する
一般公開のイメージと限定公開のイメージを Docker Hub に push するには:
Secret Manager に Docker 認証情報が保存されていて、Cloud Build にシークレットにアクセスする権限が付与されていることを確認します。
ビルド構成ファイルで、次のことを行います。
- すべてのビルド
steps
の後に、シークレットのバージョンと Docker のユーザー名とパスワードの環境変数を指定するavailableSecrets
フィールドを追加します。 - ユーザー名とパスワードを指定するビルドステップで、次のようにします。
- ビルドステップで bash ツールを使用するには、
bash
を指すentrypoint
フィールドを追加します。これは、シークレットの環境変数を参照するために必要です。 - ユーザー名とパスワードの環境変数を指定する
secretEnv
フィールドを追加します。 args
フィールドに、最初の引数として-c
フラグを追加します。-c
の後に渡した文字列はすべてコマンドとして扱われます。-c で bash コマンドを実行する方法の詳細については、bash のドキュメントをご覧ください。args
フィールドにシークレットを指定する場合は、$$
を接頭辞とする環境変数を使用して指定します。
- ビルドステップで bash ツールを使用するには、
次のビルド構成ファイルの例は、Docker にログインし、ローカルに保存されているソースコードを使用してイメージをビルドし、そのイメージをDocker リポジトリに push する方法を示しています。
YAML
steps: - name: 'gcr.io/cloud-builders/docker' entrypoint: 'bash' args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD'] secretEnv: ['USERNAME', 'PASSWORD'] - name: 'gcr.io/cloud-builders/docker' entrypoint: 'bash' args: ['-c', 'docker build -t $$USERNAME/REPOSITORY:TAG .'] secretEnv: ['USERNAME'] - name: 'gcr.io/cloud-builders/docker' entrypoint: 'bash' args: ['-c', 'docker push $$USERNAME/REPOSITORY:TAG'] secretEnv: ['USERNAME'] availableSecrets: secretManager: - versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION env: 'PASSWORD' - versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION env: 'USERNAME'
JSON
{ "steps": [ { "name": "gcr.io/cloud-builders/docker", "entrypoint": "bash", "args": [ "-c", "docker login --username=$$USERNAME --password=$$PASSWORD" ], "secretEnv": [ "USERNAME", "PASSWORD" ] }, { "name": "gcr.io/cloud-builders/docker", "entrypoint": "bash", "args": [ "-c", "docker build -t $$USERNAME/REPOSITORY:TAG ." ], "secretEnv": [ "USERNAME" ] }, { "name": "gcr.io/cloud-builders/docker", "entrypoint": "bash", "args": [ "-c", "docker push $$USERNAME/REPOSITORY:TAG" ], "secretEnv": [ "USERNAME" ] } ], "availableSecrets": { "secretManager": [{ "versionName": "projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION", "env": "PASSWORD" }, { "versionName": "projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION", "env": "USERNAME" }] } }
上記のコマンドのプレースホルダ値を次のように置き換えます。
PROJECT_ID
: シークレットを保存している Google Cloud プロジェクトの ID。DOCKER_USERNAME_SECRET_NAME
: Docker ユーザー名に対応するシークレット名。DOCKER_USERNAME_SECRET_VERSION
: Docker ユーザー名のシークレット バージョン。DOCKER_PASSWORD_SECRET_NAME
: Docker パスワードに対応するシークレット名。DOCKER_PASSWORD_SECRET_VERSION
: Docker パスワードのシークレット バージョン。REPOSITORY
: イメージを push する Docker リポジトリの名前。TAG
: イメージのタグ名。
- すべてのビルド
ビルド構成ファイルを使用して、ビルドを手動で開始するか、トリガーを使用してビルドを自動化します。
Docker クライアント バージョンの操作
Cloud Build でサポートされている Docker ビルダー gcr.io/cloud-builders/docker
は Docker 20.10.14 を使用します。このバージョンでは、Docker にイメージを push するときにタグを指定しない場合、Docker は latest
タグを持つイメージのみを push します。latest
タグが存在しない場合、push が失敗します。
特定のタグが付いたイメージを Docker に push するには、docker push
ビルドステップでタグを指定します。次の例では、prod
というタグのイメージを push します。
YAML
steps:
...
- name: 'gcr.io/cloud-builders/docker'
args: ['docker', 'push', '$$USERNAME/myrepo:prod']
...
JSON
{
...
{
"name": "gcr.io/cloud-builders/docker",
"args": [
"docker",
"push",
"$$USERNAME/myrepo:prod"
],
}
...
}
イメージのすべてのタグを Docker に push するには、docker push
ビルドステップで引数のリストに -a
フラグを追加します。
YAML
steps:
...
- name: 'gcr.io/cloud-builders/docker'
args: ['docker', 'push', '-a', '$$USERNAME/myrepo']
...
JSON
{
...
{
"name": "gcr.io/cloud-builders/docker",
"args": [
"docker",
"push",
"-a",
"$$USERNAME/myrepo"
],
}
...
}
Docker クライアント 19.03.9 を使用するには、Docker ビルダーのバージョンをタグ付けします。
YAML
steps:
...
- name: 'gcr.io/cloud-builders/docker:19.03.9'
args: ['docker', 'push', '$$USERNAME/myrepo:prod']
...
JSON
{
...
{
"name": "gcr.io/cloud-builders/docker:19.03.9",
"args": [
"docker",
"push",
"$$USERNAME/myrepo:prod"
],
}
...
}
次のステップ
- 基本的なビルド構成ファイルを作成する方法を学習する。
- 手動でビルドを実行する方法やビルドトリガーで自動化する方法を学習する。