Docker Hub イメージとのやり取り

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 に保存するには:

  1. Cloud Console の [Secret Manager] ページに移動します。

    [Secret Manager] ページに移動

  2. [シークレット マネージャー] ページで、[シークレットを作成] をクリックします。

  3. [シークレットの作成] ページの [名前] に「docker-username」と入力します。

  4. [シークレットの値] フィールドに、Docker のユーザー名を入力します。

  5. [リージョン] セクションは変更しません。

  6. [シークレットを作成] ボタンをクリックします。

上記の手順を繰り返して、Docker のパスワードを Secret Manager に保存します。

シークレットの Secret Manager のシークレット アクセサーの IAM ロールを Cloud Build サービス アカウントに付与するには:

  1. Google Cloud Console で [シークレット マネージャー] ページを開きます。

    [Secret Manager] ページに移動

  2. Docker のユーザー名とパスワードに対応するシークレットのチェックボックスをオンにします。

  3. まだ開いていない場合は、[情報パネルを表示] をクリックしてパネルを開きます。

  4. パネルの [権限] で、[プリンシパルを追加] をクリックします。

  5. [新しいプリンシパル] テキストボックスに、Cloud Build サービス アカウントのメールアドレスを PROJECT_NUMBER@cloudbuild.gserviceaccount.com の形式で入力します。ここで、PROJECT_NUMBERビルドを実行しているプロジェクトのプロジェクト番号です。プロジェクト番号は [プロジェクトの設定] ページで確認できます。

  6. [ロールを選択] プルダウン ボックスで、[Secret Manager のシークレット アクセサー] のロールを選択します。

  7. [保存] をクリックします。

Docker Hub から限定公開のイメージを pull する

Docker Hub から限定公開のイメージを pull するには:

  1. Secret Manager に Docker 認証情報が保存されていて、Cloud Build にシークレットにアクセスする権限が付与されていることを確認します。

  2. ビルド構成ファイルで、次のことを行います。

    • すべてのビルド steps の後に、シークレットのバージョンと Docker のユーザー名とパスワードの環境変数を指定する availableSecrets フィールドを追加します。
    • ユーザー名とパスワードを指定するビルドステップで、次のようにします。
      • ビルドステップで bash ツールを使用するには、bash を指す entrypoint フィールドを追加します。これは、シークレットの環境変数を参照するために必要です。
      • ユーザー名とパスワードの環境変数を指定する secretEnv フィールドを追加します。
      • args フィールドに、最初の引数として -c フラグを追加します。-c の後に渡した文字列はすべてコマンドとして扱われます。-c で bash コマンドを実行する方法の詳細については、bash のドキュメントをご覧ください。
      • args フィールドにシークレットを指定する場合は、$$ を接頭辞とする環境変数を使用して指定します。

    次のビルド構成ファイルは、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: イメージのタグ名。
  3. ビルド構成ファイルを使用して、ビルドを手動で開始するか、トリガーを使用してビルドを自動化します。

イメージを Docker Hub に push する

一般公開のイメージと限定公開のイメージを Docker Hub に push するには:

  1. Secret Manager に Docker 認証情報が保存されていて、Cloud Build にシークレットにアクセスする権限が付与されていることを確認します。

  2. ビルド構成ファイルで、次のことを行います。

    • すべてのビルド steps の後に、シークレットのバージョンと Docker のユーザー名とパスワードの環境変数を指定する availableSecrets フィールドを追加します。
    • ユーザー名とパスワードを指定するビルドステップで、次のようにします。
      • ビルドステップで bash ツールを使用するには、bash を指す entrypoint フィールドを追加します。これは、シークレットの環境変数を参照するために必要です。
      • ユーザー名とパスワードの環境変数を指定する secretEnv フィールドを追加します。
      • args フィールドに、最初の引数として -c フラグを追加します。-c の後に渡した文字列はすべてコマンドとして扱われます。-c で bash コマンドを実行する方法の詳細については、bash のドキュメントをご覧ください。
      • args フィールドにシークレットを指定する場合は、$$ を接頭辞とする環境変数を使用して指定します。

    次のビルド構成ファイルの例は、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: イメージのタグ名。
  3. ビルド構成ファイルを使用して、ビルドを手動で開始するか、トリガーを使用してビルドを自動化します。

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"
      ],
  }
  ...
}

次のステップ