Berinteraksi dengan image Docker Hub

Anda dapat menggunakan image container dari Docker Hub untuk menjalankan tugas di Cloud Build. Selain itu, jika build Anda menghasilkan image, Anda dapat mengirimkannya ke Docker Hub. Halaman ini menjelaskan cara menulis file konfigurasi build untuk mengirim dan menarik image Docker Hub. Untuk ringkasan semua kolom yang tersedia dalam file konfigurasi build, lihat Ringkasan Konfigurasi Build.

Mengambil image publik dari Docker Hub

Anda dapat menarik image Docker resmi, image bersertifikasi Docker, dan image kustom yang disimpan di Docker Hub dalam langkah build dengan menentukan nama image di kolom name. Cloud Build akan terlebih dahulu menarik image yang ditentukan dari Docker Hub, lalu menggunakan image tersebut untuk menjalankan langkah build.

Dalam contoh di bawah, Cloud Build menarik image Docker untuk maven untuk menjalankan perintah mvn yang ditentukan dalam args:

YAML

steps:
- name: "maven"
  args: ["mvn", "--version"]

JSON

{
   "steps": [
      {
         "name": "maven",
         "args": [
            "mvn",
            "--version"
         ]
      }
   ]
}

Menyimpan kredensial Docker di Secret Manager

Untuk menarik image pribadi dan mengirim image publik dan pribadi ke Docker Hub, Cloud Build harus melakukan autentikasi ke Docker dengan kredensial Anda. Untuk menyertakan kredensial Docker dalam build, Anda harus menyimpan kredensial terlebih dahulu di Secret Manager, lalu memberikan izin agar Cloud Build dapat mengakses secret dari Secret Manager.

Untuk menyimpan kredensial Docker di Secret Manager:

  1. Buka halaman Secret Manager di konsol Google Cloud :

    Buka halaman Secret Manager

  2. Di halaman Secret Manager, klik Buat Secret.

  3. Di halaman Create secret, di bagian Name, masukkan docker-username.

  4. Di kolom Nilai rahasia, masukkan nama pengguna Docker Anda.

  5. Jangan ubah bagian Wilayah.

  6. Klik tombol Buat secret.

Ulangi langkah-langkah di atas untuk menyimpan sandi Docker Anda di Secret Manager.

Untuk memberikan peran IAM Secret Manager Secret Accessor untuk secret ke akun layanan yang Anda gunakan untuk build:

  1. Buka halaman Secret Manager di konsol Google Cloud :

    Buka halaman Secret Manager

  2. Pilih kotak centang rahasia yang sesuai dengan nama pengguna dan sandi Docker Anda.

  3. Jika belum terbuka, klik Tampilkan panel info untuk membuka panel.

  4. Di panel, di bagian Izin, klik Tambahkan akun utama.

  5. Di kolom New principals, masukkan alamat email akun layanan Anda.

  6. Di kotak drop-down Pilih peran, pilih peran Secret Manager Secret Accessor.

  7. Klik Simpan.

Mengambil image pribadi dari Docker Hub

Untuk menarik image pribadi dari Docker Hub:

  1. Pastikan Anda telah menyimpan kredensial Docker di Secret Manager dan memberikan izin bagi Cloud Build untuk mengakses secret tersebut.

  2. Di file konfigurasi build:

    • Setelah semua build steps, tambahkan kolom availableSecrets yang menentukan versi rahasia dan variabel lingkungan untuk nama pengguna dan sandi Docker.
    • Pada langkah build tempat Anda ingin menentukan nama pengguna dan sandi:
      • Tambahkan kolom entrypoint yang mengarah ke bash untuk menggunakan alat bash di langkah build. Hal ini diperlukan untuk merujuk ke variabel lingkungan untuk secret.
      • Tambahkan kolom secretEnv yang menentukan variabel lingkungan untuk nama pengguna dan sandi.
      • Di kolom args, tambahkan tanda -c sebagai argumen pertama. String apa pun yang Anda teruskan setelah -c diperlakukan sebagai perintah. Untuk mengetahui informasi selengkapnya tentang menjalankan perintah bash dengan -c, lihat dokumentasi bash.
      • Saat menentukan secret di kolom args, tentukan menggunakan variabel lingkungan yang diawali dengan $$.

    The following build config file shows how to login to Docker using the Docker username and password stored in Secret Manager, and run a private image.

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

    Replace the placeholder values in the above commands with the following:

    • PROJECT_ID: The ID of the Google Cloud project where you've stored your secrets.
    • DOCKER_USERNAME_SECRET_NAME: The secret name corresponding to your Docker username.
    • DOCKER_USERNAME_SECRET_VERSION: The secret version of your Docker username.
    • DOCKER_PASSWORD_SECRET_NAME: The secret name corresponding to your Docker password.
    • DOCKER_PASSWORD_SECRET_VERSION: The secret version of your Docker password.
    • REPOSITORY: The name of your Docker repository from where you're pulling the image.
    • TAG: The tag name of your image.
  3. Use the build config file to manually start a build or to automate builds using triggers.

Pushing images to Docker Hub

To push public and private images to Docker Hub:

  1. Make sure you've stored your Docker credentials in Secret Manager and granted permissions for Cloud Build to access the secret.

  2. In the build config file:

    • After all the build steps, add an availableSecrets field specifying the secret version and the env variable for the Docker username and password.
    • In the build step where you want to specify the username and password:
      • Add an entrypoint field pointing to bash to use the bash tool in the build step. This is required to refer to the environment variable for the secret.
      • Add a secretEnv field specifying the environment variable for username and password.
      • In the args field, add a -c flag as the first argument. Any string you pass after -c is treated as a command. For more information on running bash commands with -c, see the bash documentation.
      • When specifying the secret in the args field, specify it using the environment variable prefixed with $$.

    The following example build config file shows how to login to Docker, build an image with source code stored locally, and then push the image to Docker repository.

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

    Ganti nilai placeholder dalam perintah di atas dengan nilai berikut:

    • PROJECT_ID: ID project Google Cloud tempat Anda menyimpan secret.
    • DOCKER_USERNAME_SECRET_NAME: Nama rahasia yang sesuai dengan nama pengguna Docker Anda.
    • DOCKER_USERNAME_SECRET_VERSION: Versi secret nama pengguna Docker Anda.
    • DOCKER_PASSWORD_SECRET_NAME: Nama rahasia yang sesuai dengan sandi Docker Anda.
    • DOCKER_PASSWORD_SECRET_VERSION: Versi rahasia sandi Docker Anda.
    • REPOSITORY: Nama repositori Docker tempat Anda mengirim image.
    • TAG: Nama tag gambar Anda.
  3. Gunakan file konfigurasi build untuk memulai build secara manual atau mengotomatiskan build menggunakan pemicu.

Bekerja dengan versi klien Docker

Builder Docker yang didukung untuk Cloud Build, gcr.io/cloud-builders/docker menggunakan Docker 20.10.14. Dengan versi ini, jika Anda tidak menentukan tag saat mengirim image ke Docker, Docker hanya akan mengirim image dengan tag latest. Jika tag latest tidak ada, push akan gagal.

Untuk mengirim image dengan tag tertentu ke Docker, tentukan tag di docker push langkah build. Contoh berikut mengirimkan gambar yang diberi tag prod:

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

Untuk mengirim semua tag image ke Docker, tambahkan tanda -a ke daftar argumen di langkah build docker push:

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

Anda dapat menggunakan klien Docker 19.03.9 dengan memberi tag pada versi di builder 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"
      ],
  }
  ...
}

Langkah berikutnya