Membuat gambar container

Halaman ini menjelaskan cara mengonfigurasi Cloud Build untuk mem-build dan menyimpan image Docker. Jika Anda baru menggunakan Cloud Build, baca panduan memulai dan ringkasan konfigurasi build terlebih dahulu.

Cloud Build menyediakan image bawaan yang dapat Anda referensikan dalam file konfigurasi Cloud Build untuk menjalankan tugas. Image ini didukung dan dikelola oleh Google Cloud. Anda dapat menggunakan image Docker bawaan yang didukung untuk menjalankan perintah Docker dan mem-build image Docker.

Sebelum memulai

Petunjuk di halaman ini mengasumsikan bahwa Anda sudah memahami Docker. Selain itu:

  • Siapkan kode sumber aplikasi Anda beserta Dockerfile.
  • Memiliki repositori Docker untuk menyimpan image di Artifact Registry, atau membuat repositori baru.
  • Jika Anda ingin menggunakan perintah gcloud di halaman ini, instal Google Cloud CLI.
  • Jika Anda ingin menjalankan image, instal Docker
  • Jika Anda ingin menandatangani gambar dengan cosign, ikuti petunjuk di Memberi otorisasi akses layanan ke layanan untuk membuat akun layanan yang ditentukan pengguna dan memberikan izin yang diperlukan untuk membuat token ID.

Membangun dengan file konfigurasi build

Untuk mem-build image Docker menggunakan file konfigurasi build:

  1. Di direktori yang sama yang berisi kode sumber aplikasi Anda, buat file bernama cloudbuild.yaml atau cloudbuild.json.
  2. Di file konfigurasi build:

    • Tambahkan kolom name dan tentukan image Docker yang telah dibuat sebelumnya. Image yang telah dibuat sebelumnya disimpan di gcr.io/cloud-builders/docker. Dalam contoh file konfigurasi di bawah, kolom name menentukan bahwa image Docker bawaan digunakan oleh Cloud Build untuk menjalankan tugas yang ditunjukkan oleh kolom args.
    • Di kolom args, tambahkan argumen untuk mem-build image.

      YAML

      steps:
      - name: 'gcr.io/cloud-builders/docker'
        args: [ 'build', '-t', 'LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME', '.' ]
      

      JSON

      {
       "steps": [
        {
            "name": "gcr.io/cloud-builders/docker",
            "args": [
              "build",
              "-t",
              "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME",
              "."
             ]
         }
         ]
       }
      

      Ganti nilai placeholder dalam konfigurasi build di atas dengan nilai berikut:

    • LOCATION: lokasi regional atau multi-regional repositori Docker Anda di Artifact Registry.

    • PROJECT_ID: Project ID Google Cloud Anda.

    • REPOSITORY: nama repositori Docker Anda di Artifact Registry.

    • IMAGE_NAME: nama image container Anda.

      Jika Dockerfile dan kode sumber Anda berada di direktori yang berbeda, tambahkan -f dan jalur ke Dockerfile ke daftar argumen di kolom args:

      YAML

      steps:
      - name: 'gcr.io/cloud-builders/docker'
        args: [ 'build', '-t', 'LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME', '-f', 'DOCKERFILE_PATH', '.' ]
      

      JSON

      {
       "steps": [
        {
            "name": "gcr.io/cloud-builders/docker",
            "args": [
              "build",
              "-t",
              "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME", '-f', 'DOCKERFILE_PATH', "."
             ]
         }
         ]
       }
      

      Ganti nilai placeholder dalam konfigurasi build di atas dengan nilai berikut:

      • LOCATION: lokasi regional atau multi-regional untuk repositori Anda.
      • PROJECT_ID: Project ID Google Cloud Anda.
      • REPOSITORY: nama repositori Artifact Registry Anda.
      • IMAGE_NAME: nama image container Anda.
      • DOCKERFILE_PATH: jalur ke Dockerfile Anda.
  3. Mulai build menggunakan file konfigurasi build:

    gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORY
    

    Ganti nilai placeholder dalam perintah di atas dengan yang berikut ini:

    • CONFIG_FILE_PATH: jalur ke file konfigurasi build.
    • SOURCE_DIRECTORY: jalur atau URL ke kode sumber.

    Jika Anda tidak menentukan CONFIG_FILE_PATH dan SOURCE_DIRECTORY dalam perintah gcloud builds submit, Cloud Build akan mengasumsikan bahwa file konfigurasi dan kode sumber berada di direktori kerja saat ini.

Membangun dengan Dockerfile

Cloud Build memungkinkan Anda mem-build image Docker hanya menggunakan Dockerfile. Anda tidak memerlukan file konfigurasi build terpisah.

Untuk mem-build menggunakan Dockerfile, jalankan perintah berikut dari direktori yang berisi kode sumber dan Dockerfile:

    gcloud builds submit --tag LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME

Ganti nilai placeholder dalam perintah di atas dengan yang berikut ini:

  • LOCATION: lokasi regional atau multi-regional untuk repositori Anda.
  • PROJECT_ID: Project ID Google Cloud Anda.
  • REPOSITORY: nama repositori Artifact Registry Anda.
  • IMAGE_NAME: nama image container Anda.

Membangun dengan buildpack Google Cloud

Cloud Build memungkinkan Anda mem-build image tanpa Dockerfile atau file konfigurasi build. Anda dapat melakukannya menggunakan buildpack Google Cloud.

Untuk mem-build menggunakan buildpack, jalankan perintah berikut dari direktori yang berisi kode sumber Anda:

    gcloud builds submit --pack builder=BUILDPACK_BUILDER, \
        env=ENVIRONMENT_VARIABLE, \
        image=IMAGE_NAME

Ganti nilai placeholder dalam perintah di atas dengan yang berikut ini:

  • BUILDPACK_BUILDER: builder buildpack yang akan digunakan. Jika Anda tidak menentukan builder, Cloud Build akan menggunakan gcr.io/buildpacks/builder secara default.
  • ENVIRONMENT_VARIABLE: variabel lingkungan apa pun untuk build Anda.
  • IMAGE: URL gambar di Artifact Registry. URL image harus dalam format LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME.

Berikut adalah beberapa contoh perintah:

  • Menjalankan build menggunakan gcr.io/buildpacks/builder default untuk membuat us-docker.pkg.dev/gcb-docs-project/containers/gke/hello-app image:

      gcloud builds submit --pack image=us-docker.pkg.dev/gcb-docs-project/containers/gke/hello-app
    
  • Meneruskan beberapa variabel lingkungan ke build Anda menggunakan ^--^ sebagai pemisah. Untuk mengetahui informasi selengkapnya tentang argumen escape, lihat gcloud topic escaping.

      gcloud builds submit --pack \
          ^--^image=gcr.io/my-project/myimage--env=GOOGLE_ENTRYPOINT='java -jar target/myjar.jar',GOOGLE_RUNTIME_VERSION='3.1.301'
    

Mengonfigurasi pemicu untuk menggunakan buildpack: Selain mem-build menggunakan command line, Anda dapat mengonfigurasi pemicu untuk menggunakan buildpack guna mem-build image secara otomatis. Untuk mempelajari lebih lanjut, lihat Membuat dan mengelola pemicu build.

Berbagai cara menyimpan image di Artifact Registry

Anda dapat mengonfigurasi Cloud Build untuk menyimpan image yang di-build dengan salah satu cara berikut:

  • menggunakan kolom images, yang menyimpan image di Artifact Registry setelah build selesai.
  • menggunakan perintah docker push, yang menyimpan image di Artifact Registry sebagai bagian dari alur build Anda.

Perbedaan antara penggunaan kolom images dan perintah push Docker adalah jika Anda menggunakan kolom images, image yang disimpan akan ditampilkan dalam hasil build. Hal ini mencakup halaman Deskripsi build untuk build di konsol Google Cloud, hasil Build.get(), dan hasil gcloud builds list. Namun, jika Anda menggunakan perintah push Docker untuk menyimpan image yang di-build, image tidak akan ditampilkan dalam hasil build.

Jika Anda ingin menyimpan image sebagai bagian dari alur build dan ingin menampilkan image dalam hasil build, gunakan perintah push Docker dan kolom images dalam file konfigurasi build Anda.

Untuk menyimpan image container di Artifact Registry setelah build selesai:

  1. Jika repositori target tidak ada, buat repositori baru.
  2. Di direktori yang sama yang berisi kode sumber aplikasi dan Dockerfile, buat file bernama cloudbuild.yaml atau cloudbuild.json.
  3. Dalam file konfigurasi build, tambahkan langkah build untuk mem-build image, lalu tambahkan kolom images yang menentukan image yang di-build. Tindakan ini akan menyimpan image di Artifact Registry. Cuplikan berikut menunjukkan konfigurasi build untuk mem-build image dan menyimpannya di Artifact Registry:

    YAML

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      args: [ 'build', '-t', 'LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME', '.' ]
    images: ['LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME']
    

    JSON

    {
    "steps": [
    {
        "name": "gcr.io/cloud-builders/docker",
        "args": [
            "build",
            "-t",
            "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME",
            "."
        ]
    }
    ],
    "images": [
        "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME"
    ]
    }
    

    Dengan keterangan:

    • LOCATION: lokasi regional atau multi-regional untuk repositori Anda.
    • PROJECT_ID: Project ID Google Cloud Anda.
    • REPOSITORY: nama repositori Artifact Registry Anda.
    • IMAGE_NAME: nama image container Anda.
  4. Mulai build menggunakan file konfigurasi build:

    gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORY
    

    Dengan keterangan:

    • CONFIG_FILE_PATH adalah jalur ke file konfigurasi build.
    • SOURCE_DIRECTORY adalah jalur atau URL ke kode sumber.

Untuk menyimpan image di Artifact Registry sebagai bagian dari alur build Anda:

  1. Di direktori yang sama yang berisi kode sumber aplikasi dan Dockerfile, buat file bernama cloudbuild.yaml atau cloudbuild.json.

  2. Dalam file konfigurasi build, tambahkan langkah build docker untuk mem-build image, lalu tambahkan langkah build docker lain dan teruskan argumen untuk memanggil perintah push:

    YAML

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t', 'LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME', '.']
    - name: 'gcr.io/cloud-builders/docker'
      args: ['push', 'LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME']
    

    JSON

    {
      "steps": [
       {
          "name": "gcr.io/cloud-builders/docker",
          "args": [
              "build",
              "-t",
              "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME",
              "."
           ]
       },
       {
           "name": "gcr.io/cloud-builders/docker",
           "args": [
              "push",
              "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME"
            ]
       }
      ]
    }
    

    Dengan keterangan:

    • LOCATION: lokasi regional atau multi-regional untuk repositori Anda.
    • PROJECT_ID: Project ID Google Cloud Anda.
    • REPOSITORY: nama repositori Artifact Registry Anda.
    • IMAGE_NAME: nama image container Anda.
  3. Mulai build menggunakan file konfigurasi build:

    gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORY
    

    Dengan keterangan:

    • CONFIG_FILE_PATH adalah jalur ke file konfigurasi build.
    • SOURCE_DIRECTORY adalah jalur atau URL ke kode sumber.

Untuk menyimpan gambar sebagai bagian dari alur build dan menampilkan gambar dalam hasil build:

  1. Di direktori yang sama yang berisi kode sumber aplikasi dan Dockerfile, buat file bernama cloudbuild.yaml atau cloudbuild.json.
  2. Dalam file konfigurasi build, setelah langkah yang mem-build image, tambahkan langkah untuk memanggil perintah push Docker, lalu tambahkan kolom images:

    YAML

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t', 'LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME', '.']
    - name: 'gcr.io/cloud-builders/docker'
      args: ['push', 'LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME']
    images: ['LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME']
    

    JSON

    {
        "steps": [
       {
           "name": "gcr.io/cloud-builders/docker",
           "args": [
               "build",
               "-t",
               "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME",
               "."
            ]
       },
       {
           "name": "gcr.io/cloud-builders/docker",
           "args": [
               "push",
               "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME"
            ]
       }
       ],
        "images": [
           "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME"
        ]
    }
    

    Dengan keterangan:

    • LOCATION: lokasi regional atau multi-regional untuk repositori Anda.
    • PROJECT_ID: Project ID Google Cloud Anda.
    • REPOSITORY: nama repositori Artifact Registry Anda.
    • IMAGE_NAME: nama image container Anda.
  3. Mulai build menggunakan file konfigurasi build:

    gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORY
    

    Dengan keterangan:

    • CONFIG_FILE_PATH adalah jalur ke file konfigurasi build.
    • SOURCE_DIRECTORY adalah jalur atau URL ke kode sumber.

Menandatangani image container dengan cosign

Jika menyimpan image di Artifact Registry, Anda dapat menambahkan lapisan keamanan lain dengan menggunakan alat cosign untuk membuat catatan akun layanan mana yang digunakan untuk memulai build. Didukung oleh standar OpenID Connect (OIDC), auditor dapat menggunakan data tersebut untuk memverifikasi bahwa image dibuat oleh akun layanan tepercaya.

Langkah-langkah berikut menunjukkan cara menggunakan file konfigurasi cloudbuild.yaml untuk mendapatkan token identitas dan menandatangani image penampung.

YAML

  steps:
  - name: 'gcr.io/cloud-builders/docker'
    id: 'tag-and-push'
    script: |
      #!/bin/sh
      set -e
      docker build -t $_IMAGE .
      docker push "$_IMAGE"
      docker inspect $_IMAGE --format "$_IMAGE@{{.Id}}" >image_with_digest
  - name: 'gcr.io/cloud-builders/gcloud'
    id: 'generate-token'
    script: |
      #!/bin/sh
      set -e
      gcloud auth print-identity-token --audiences=sigstore > token
  - name: 'gcr.io/cloud-builders/docker'
    id: 'sign-image'
    script: |
      #!/bin/sh
      set -e
      docker run \
      --network=cloudbuild \
      --mount source=home-volume,target=/builder/home \
      --rm \
      -e SIGSTORE_NO_CACHE=true \
      -e HOME=/builder/home \
      gcr.io/projectsigstore/cosign \
      sign --identity-token=$(cat token) $(cat image_with_digest) -y
  service_account: '$_SERVICE_ACCOUNT'
  artifacts:
    images:
    - $_IMAGE
  substitutions:
    _IMAGE: 'LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME'
    _SERVICE_ACCOUNT_ID: 'SERVICE_ACCOUNT_ID'
    _SERVICE_ACCOUNT: projects/${PROJECT_ID}/serviceAccounts/${_SERVICE_ACCOUNT_ID}
  options:
    env:
    - '_IMAGE=$_IMAGE'
    dynamic_substitutions: true
    logging: CLOUD_LOGGING_ONLY

JSON

    {
        "steps": [
            {
                "name": "gcr.io/cloud-builders/docker",
                "id": "tag-and-push",
                "script": "#!/bin/sh set -e \ndocker build -t $_IMAGE . \ndocker push \"$_IMAGE\""
            },
            {
                "name": "gcr.io/cloud-builders/gcloud",
                "id": "generate-token-and-get-digest",
                "script": "#!/bin/sh set -e \ngcloud auth print-identity-token --audiences=sigstore > token \ngcloud container images describe \"$_IMAGE\" --format=\"value(image_summary.fully_qualified_digest)\" > image_with_digest"
            },
            {
                "name": "gcr.io/projectsigstore/cosign",
                "id": "sign-image",
                "script": "#!/busybox/sh cosign sign --identity-token=$(cat token) $(cat image_with_digest) -y",
                "env": [
                    "SIGSTORE_NO_CACHE=true"
                ]
            }
        ],
        "service_account": "$_SERVICE_ACCOUNT",
        "artifacts": {
            "images": [
                "$_IMAGE"
            ]
        },
        "substitutions": {
            "_IMAGE": "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME",
            "_SERVICE_ACCOUNT_ID": "SERVICE_ACCOUNT_ID",
            "_SERVICE_ACCOUNT": "projects/${PROJECT_ID}/serviceAccounts/${_SERVICE_ACCOUNT_ID}"
        },
        "options": {
            "env": [
                "_IMAGE=$_IMAGE"
            ],
            "dynamic_substitutions": true,
            "logging": "CLOUD_LOGGING_ONLY"
        }
    }

Dengan keterangan:

  • LOCATION adalah lokasi regional atau multi-regional repositori tempat image disimpan, misalnya us-east1 atau us.

  • PROJECT_ID: Project ID Google Cloud Anda.

  • REPOSITORY adalah nama repositori tempat gambar disimpan.

  • IMAGE_NAME adalah nama image.

  • SERVICE_ACCOUNT_ID adalah alamat email akun layanan yang ditentukan pengguna yang ingin Anda gunakan untuk menjalankan build. Misalnya, alamat email akun layanan terlihat seperti: service-account-name@project-id.iam.gserviceaccount.com.

Untuk memverifikasi tanda tangan, instal cosign di komputer lokal, lalu jalankan perintah cosign verify:

cosign verify \
--certificate-identity=SERVICE_ACCOUNT_ID \
--certificate-oidc-issuer=https://accounts.google.com \
IMAGE

Dengan keterangan:

  • SERVICE_ACCOUNT_ID adalah alamat email akun layanan tepercaya yang Anda harapkan telah digunakan untuk mem-build image penampung.
  • IMAGE adalah nama gambar lengkap termasuk ringkasan gambar sha256.

Menjalankan image Docker

Untuk memverifikasi bahwa image yang Anda build berfungsi seperti yang diharapkan, Anda dapat menjalankannya menggunakan Docker.

  1. Konfigurasi Docker untuk menggunakan kredensial Artifact Registry Anda saat berinteraksi dengan Artifact Registry. (Anda hanya perlu melakukannya sekali.) Gunakan perintah berikut untuk melakukan autentikasi menggunakan helper kredensial gcloud.

    gcloud auth configure-docker HOSTNAME-LIST
    

    Dengan HOSTNAME-LIST adalah daftar nama host repositori yang dipisahkan koma untuk ditambahkan ke konfigurasi helper kredensial.

    Misalnya, untuk menambahkan region us-central1 dan asia-northeast1, jalankan perintah:

    gcloud auth configure-docker us-central1-docker.pkg.dev,asia-northeast1-docker.pkg.dev
    
  2. Jalankan image Docker yang Anda build sebelumnya:

    docker run LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME
    

    Dengan keterangan:

    • LOCATION: lokasi regional atau multi-regional untuk repositori Anda.
    • PROJECT_ID: Project ID Google Cloud Anda.
    • REPOSITORY: nama repositori Artifact Registry Anda.
    • IMAGE_NAME: nama image container Anda.

    Anda akan melihat output yang mirip dengan berikut ini:

    Hello, world! The time is Fri Feb  2 16:09:54 UTC 2018.
    

Langkah selanjutnya