Halaman ini menjelaskan cara mengonfigurasi Cloud Build untuk membangun dan menyimpan image Docker. Jika Anda baru menggunakan Cloud Build, baca panduan memulai dan ringkasan konfigurasi build terlebih dahulu.
Cloud Build menyediakan image siap pakai yang dapat Anda referensikan dalam file konfigurasi Cloud Build untuk menjalankan tugas. Gambar ini didukung dan dikelola oleh Google Cloud. Anda dapat menggunakan image Docker bawaan yang didukung untuk menjalankan perintah Docker dan membangun 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
gclouddi halaman ini, instal Google Cloud CLI. - Jika Anda ingin menjalankan image, instal Docker
- Jika Anda ingin menandatangani gambar dengan cosign, ikuti petunjuk di Mengizinkan 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 membangun image Docker menggunakan file konfigurasi build:
- Di direktori yang sama yang berisi kode sumber aplikasi Anda, buat file bernama
cloudbuild.yamlataucloudbuild.json. Di file konfigurasi build:
- Tambahkan kolom
namedan tentukan image Docker yang telah dibuat sebelumnya. Image bawaan disimpan digcr.io/cloud-builders/docker. Dalam file konfigurasi contoh berikut, kolomnamemenentukan bahwa image Docker bawaan digunakan oleh Cloud Build untuk menjalankan tugas yang ditunjukkan oleh kolomargs. Di kolom
args, tambahkan argumen untuk membuat gambar.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", "." ] } ] }
Dengan:
LOCATION: lokasi regional atau multi-regional repositori Docker Anda di Artifact Registry.PROJECT_ID: Google Cloud Project ID Anda.REPOSITORY: nama repositori Docker Anda di Artifact Registry.IMAGE_NAME: nama image container Anda.Jika
Dockerfiledan kode sumber Anda berada di direktori yang berbeda, tambahkan-fdan jalur keDockerfileke daftar argumen di kolomargs: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', "." ] } ] }Dengan:
LOCATION: lokasi regional atau multi-regional untuk repositori Anda.PROJECT_ID: Google Cloud Project ID Anda.REPOSITORY: nama repositori Artifact Registry Anda.IMAGE_NAME: nama image container Anda.DOCKERFILE_PATH: jalur keDockerfileAnda.
- Tambahkan kolom
Mulai build menggunakan file konfigurasi build:
gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORYDengan:
CONFIG_FILE_PATH: jalur ke file konfigurasi build.SOURCE_DIRECTORY: jalur atau URL ke kode sumber.
Jika Anda tidak menentukan
CONFIG_FILE_PATHdanSOURCE_DIRECTORYdalam perintahgcloud builds submit, Cloud Build mengasumsikan bahwa file konfigurasi dan kode sumber berada di direktori kerja saat ini.
Membangun dengan Dockerfile
Cloud Build memungkinkan Anda membangun image Docker hanya dengan
Dockerfile. Anda tidak memerlukan file konfigurasi build terpisah.
Untuk mem-build menggunakan Dockerfile, jalankan perintah berikut dari direktori yang berisi kode sumber dan Dockerfile Anda:
gcloud builds submit --tag LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME
Dengan:
LOCATION: lokasi regional atau multi-regional untuk repositori Anda.PROJECT_ID: Google Cloud Project ID Anda.REPOSITORY: nama repositori Artifact Registry Anda.IMAGE_NAME: nama image container Anda.
Membangun dengan buildpack Google Cloud
Cloud Build memungkinkan Anda membuat 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
Dengan:
- BUILDPACK_BUILDER: builder buildpack yang akan digunakan.
Jika Anda tidak menentukan builder, Cloud Build akan menggunakan
gcr.io/buildpacks/buildersecara default. - ENVIRONMENT_VARIABLE: variabel lingkungan apa pun untuk build Anda.
- IMAGE: URL gambar di Artifact Registry. URL gambar harus dalam format LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME.
Berikut beberapa contoh perintahnya:
Menjalankan build menggunakan
gcr.io/buildpacks/builderdefault untuk membuat imageus-docker.pkg.dev/gcb-docs-project/containers/gke/hello-app:gcloud builds submit --pack image=us-docker.pkg.dev/gcb-docs-project/containers/gke/hello-appMeneruskan beberapa variabel lingkungan ke build menggunakan
^--^sebagai pemisah. Untuk mengetahui informasi selengkapnya tentang pelepasan argumen, lihatgcloud 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 membuat menggunakan command line, Anda dapat mengonfigurasi pemicu untuk menggunakan buildpack guna membuat 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 dibuat dengan salah satu cara berikut:
- Gunakan kolom
imagesuntuk menyimpan image Docker di Artifact Registry setelah build Anda selesai. - Gunakan kolom
artifacts.ociuntuk menyimpan image OCI di Artifact Registry setelah build Anda selesai. - Gunakan perintah
docker pushuntuk menyimpan image container di Artifact Registry sebagai bagian dari alur build Anda.
Perbedaan antara penggunaan kolom images dan perintah Docker push adalah
jika Anda menggunakan kolom images, image yang disimpan akan ditampilkan di
hasil build. Hal ini mencakup halaman Deskripsi build untuk build di konsolGoogle Cloud , hasil Build.get(), dan hasil gcloud builds list. Namun, jika Anda menggunakan perintah
Docker push untuk menyimpan image yang dibuat, 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 Docker push dan kolom images
dalam file konfigurasi build.
Menyimpan image container di Artifact Registry setelah build Anda selesai
- Jika repositori target tidak ada, buat repositori baru.
- Di direktori yang sama yang berisi kode sumber aplikasi dan
Dockerfile, buat file bernamacloudbuild.yamlataucloudbuild.json. Dalam file konfigurasi build, tambahkan langkah build untuk membangun image, lalu tambahkan kolom
imagesyang menentukan image yang dibangun. Perintah ini menyimpan image di Artifact Registry. Cuplikan berikut menunjukkan konfigurasi build untuk membangun 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:
LOCATION: lokasi regional atau multi-regional untuk repositori Anda.PROJECT_ID: Google Cloud Project ID Anda.REPOSITORY: nama repositori Artifact Registry Anda.IMAGE_NAME: nama image container Anda.
Mulai build menggunakan file konfigurasi build:
gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORYDengan:
CONFIG_FILE_PATHadalah jalur ke file konfigurasi build.SOURCE_DIRECTORYadalah jalur atau URL ke kode sumber.
Menyimpan image di Artifact Registry sebagai bagian dari alur build Anda
Di direktori yang sama yang berisi kode sumber aplikasi dan
Dockerfile, buat file bernamacloudbuild.yamlataucloudbuild.json.Dalam file konfigurasi build, tambahkan langkah build
dockeruntuk membangun image, lalu tambahkan langkah builddockerlain dan teruskan argumen untuk memanggil perintahpush: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:
LOCATION: lokasi regional atau multi-regional untuk repositori Anda.PROJECT_ID: Google Cloud Project ID Anda.REPOSITORY: nama repositori Artifact Registry Anda.IMAGE_NAME: nama image container Anda.
Mulai build menggunakan file konfigurasi build:
gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORYDengan:
CONFIG_FILE_PATHadalah jalur ke file konfigurasi build.SOURCE_DIRECTORYadalah jalur atau URL ke kode sumber.
Menyimpan gambar sebagai bagian dari alur build dan untuk menampilkan gambar dalam hasil build
- Di direktori yang sama yang berisi kode sumber aplikasi dan
Dockerfile, buat file bernamacloudbuild.yamlataucloudbuild.json. Dalam file konfigurasi build, setelah langkah yang membangun image, tambahkan langkah untuk memanggil perintah Docker
push, lalu tambahkan kolomimages: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:
LOCATION: lokasi regional atau multi-regional untuk repositori Anda.PROJECT_ID: Google Cloud Project ID Anda.REPOSITORY: nama repositori Artifact Registry Anda.IMAGE_NAME: nama image container Anda.
Mulai build menggunakan file konfigurasi build:
gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORYDengan:
CONFIG_FILE_PATHadalah jalur ke file konfigurasi build.SOURCE_DIRECTORYadalah jalur atau URL ke kode sumber.
Menyimpan image OCI di Artifact Registry setelah build Anda selesai
- Di direktori yang sama yang berisi kode sumber aplikasi dan
Dockerfile, buat file bernamacloudbuild.yamlataucloudbuild.json. Di file konfigurasi build, tambahkan kolom
artifactsyang menentukan image OCI yang dibuat. Konfigurasi ini menyimpan image OCI di Artifact Registry. Contoh berikut menunjukkan konfigurasi build yang membuat image OCI dan menyimpannya di Artifact Registry:YAML
artifacts: oci: - file: 'OCI_IMAGE_PATH' registryPath: 'https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY' tags: ["primary_image"]JSON
{ "artifacts": { "oci": [ { "file": "OCI_IMAGE_PATH", "registryPath": "https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY", "tags": ["primary_image"] } ] } }Dengan:
- OCI_IMAGE_PATH adalah alamat direktori lokal yang berisi
image OCI yang akan diupload, misalnya,
/.pack/layout-repo/my-app. - LOCATION adalah lokasi regional atau multi-regional untuk repositori Anda.
- PROJECT_ID adalah Google Cloud project ID Anda.
- REPOSITORY: adalah nama repositori Artifact Registry Anda.
- OCI_IMAGE_PATH adalah alamat direktori lokal yang berisi
image OCI yang akan diupload, misalnya,
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 catatan tersebut untuk memverifikasi bahwa image dibangun oleh akun layanan tepercaya.
Langkah-langkah berikut menunjukkan cara menggunakan file konfigurasi cloudbuild.yaml untuk mendapatkan token identitas dan menandatangani image container Anda.
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:
LOCATIONadalah lokasi regional atau multi-regional repositori tempat image disimpan, misalnyaus-east1atauus.PROJECT_ID: Google Cloud Project ID Anda.REPOSITORYadalah nama repositori tempat image disimpan.IMAGE_NAMEadalah nama gambar.SERVICE_ACCOUNT_IDadalah alamat email akun layanan yang ditentukan pengguna yang ingin Anda jalankan build-nya. Misalnya, alamat email akun layanan terlihat seperti:service-account-name@project-id.iam.gserviceaccount.com.
Untuk memverifikasi tanda tangan, instal cosign
di komputer lokal Anda, lalu jalankan perintah cosign verify:
cosign verify \
--certificate-identity=SERVICE_ACCOUNT_ID \
--certificate-oidc-issuer=https://accounts.google.com \
IMAGE
Dengan:
SERVICE_ACCOUNT_IDadalah alamat email akun layanan tepercaya yang Anda harapkan telah digunakan untuk membangun image container.IMAGEadalah nama lengkap gambar termasuk digest gambar sha256.
Jalankan image Docker
Untuk memverifikasi bahwa image yang Anda buat berfungsi seperti yang diharapkan, Anda dapat menjalankannya menggunakan Docker.
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 gcloud credential helper.
gcloud auth configure-docker HOSTNAME-LISTDengan HOSTNAME-LIST adalah daftar nama host repositori yang dipisahkan koma untuk ditambahkan ke konfigurasi helper kredensial.
Misalnya, untuk menambahkan region
us-central1danasia-northeast1, jalankan perintah:gcloud auth configure-docker us-central1-docker.pkg.dev,asia-northeast1-docker.pkg.devJalankan image Docker yang Anda buat sebelumnya:
docker run LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAMEDengan:
LOCATION: lokasi regional atau multi-regional untuk repositori Anda.PROJECT_ID: Google Cloud Project ID 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 berikutnya
- Pelajari cara membangun aplikasi Java.
- Pelajari cara membuat aplikasi Python.
- Pelajari cara membuat aplikasi Go.
- Pelajari cara menyimpan artefak build di Cloud Storage.
- Pelajari cara menyimpan artefak build di Artifact Registry.
- Pelajari cara memecahkan masalah error build.