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 bawaan yang dapat Anda referensikan dalam file konfigurasi Cloud Build untuk menjalankan tugas Anda. Image ini didukung dan dikelola oleh Google Cloud. Anda dapat menggunakan image Docker yang didukung dan telah dibangun sebelumnya untuk menjalankan perintah Docker dan mem-build image Docker.
Sebelum memulai
Petunjuk pada 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 buat 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 image dengan cosign, ikuti petunjuk di Mengizinkan akses layanan-ke-layanan untuk membuat akun layanan yang ditentukan pengguna dan memberikan izin yang diperlukan untuk menghasilkan token ID.
Membangun dengan file konfigurasi build
Untuk mem-build image Docker menggunakan file konfigurasi build:
- Dalam direktori yang sama yang berisi kode sumber aplikasi Anda,
buat file bernama
cloudbuild.yaml
ataucloudbuild.json
. Dalam file konfigurasi build:
- Tambahkan kolom
name
dan tentukan image Docker yang telah dibangun sebelumnya. Image bawaan disimpan digcr.io/cloud-builders/docker
. Dalam contoh file konfigurasi di bawah ini, kolomname
menunjukkan bahwa image Docker yang telah di-build digunakan oleh Cloud Build untuk menjalankan tugas yang ditunjukkan oleh kolomargs
. Di kolom
args
, tambahkan argumen untuk membuat 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 kode 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 keDockerfile
ke 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', "." ] } ] }
Ganti nilai placeholder dalam konfigurasi build di atas dengan kode 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 keDockerfile
Anda.
- Tambahkan kolom
Mulai build menggunakan file konfigurasi build:
gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORY
Ganti nilai placeholder dalam perintah di atas dengan perintah berikut:
CONFIG_FILE_PATH
: jalur ke file konfigurasi build.SOURCE_DIRECTORY
: jalur atau URL ke kode sumber.
Jika Anda tidak menentukan
CONFIG_FILE_PATH
danSOURCE_DIRECTORY
dalam perintahgcloud builds submit
, Cloud Build menganggap file konfigurasi dan kode sumber berada di direktori kerja saat ini.
Membangun dengan Dockerfile
Dengan Cloud Build, Anda dapat mem-build image Docker hanya dengan menggunakan Dockerfile
. Anda tidak memerlukan file konfigurasi build terpisah.
Untuk mem-build menggunakan Dockerfile
, jalankan perintah berikut dari direktori yang berisi kode sumber Anda dan Dockerfile
:
gcloud builds submit --tag LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME
Ganti nilai placeholder dalam perintah di atas dengan perintah 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.
Membangun aplikasi 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 perintah berikut:
- 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 image di Artifact Registry. URL gambar harus dalam format LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME.
Berikut ini beberapa contoh perintah:
Menjalankan build menggunakan
gcr.io/buildpacks/builder
default 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-app
Meneruskan beberapa variabel lingkungan ke build Anda menggunakan
^--^
sebagai pemisah. Untuk informasi selengkapnya tentang meng-escape 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 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 build dengan salah satu cara berikut:
- menggunakan kolom
images
, yang menyimpan image di Artifact Registry setelah build Anda 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
, gambar yang tersimpan akan ditampilkan dalam hasil build. Hal ini mencakup halaman Build description 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:
- Jika repositori target tidak ada, buat repositori baru.
- Dalam direktori yang sama yang berisi kode sumber aplikasi dan
Dockerfile
Anda, buat file bernamacloudbuild.yaml
ataucloudbuild.json
. Dalam file konfigurasi build, tambahkan langkah build untuk mem-build image, lalu tambahkan kolom
images
yang menentukan image build tersebut. 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.
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:
Dalam direktori yang sama yang berisi kode sumber aplikasi dan
Dockerfile
Anda, buat file bernamacloudbuild.yaml
ataucloudbuild.json
.Dalam file konfigurasi build, tambahkan langkah build
docker
untuk mem-build image, lalu tambahkan langkah builddocker
lainnya 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 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.
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:
- Dalam direktori yang sama yang berisi kode sumber aplikasi dan
Dockerfile
Anda, buat file bernamacloudbuild.yaml
ataucloudbuild.json
. Di file konfigurasi build, setelah langkah yang mem-build image, tambahkan langkah untuk memanggil perintah
push
Docker, 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 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.
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 menggunakan alat cosign untuk membuat data 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 container.
YAML
steps:
- name: 'gcr.io/cloud-builders/docker'
id: 'tag-and-push'
script: |
#!/bin/sh
set -e
docker build -t $_IMAGE .
docker push "$_IMAGE"
- name: 'gcr.io/cloud-builders/gcloud'
id: 'generate-token-and-get-digest'
script: |
#!/bin/sh
set -e
gcloud auth print-identity-token --audiences=sigstore > token
gcloud 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
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 dari repositori tempat gambar disimpan, misalnyaus-east1
atauus
.PROJECT_ID
: Project ID Google Cloud Anda.REPOSITORY
adalah nama repositori tempat gambar disimpan.IMAGE_NAME
adalah nama gambar.SERVICE_ACCOUNT_ID
adalah alamat email akun layanan yang ditentukan pengguna yang Anda inginkan untuk menjalankan build. Misalnya, alamat email akun layanan terlihat seperti ini: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 keterangan:
SERVICE_ACCOUNT_ID
adalah alamat email akun layanan tepercaya yang Anda harapkan digunakan untuk membuat image container.IMAGE
adalah nama gambar lengkap, termasuk ringkasan gambar sha256.
Menjalankan image Docker
Untuk memastikan image yang dibuat berfungsi seperti yang diharapkan, Anda dapat menjalankannya menggunakan Docker.
Konfigurasi Docker agar menggunakan kredensial Artifact Registry saat berinteraksi dengan Artifact Registry. (Anda hanya diharuskan melakukannya satu kali.) Gunakan perintah berikut untuk melakukan autentikasi menggunakan gcloud credential helper.
gcloud auth configure-docker HOSTNAME-LIST
Dalam hal ini, HOSTNAME-LIST adalah daftar nama host repositori yang dipisahkan koma untuk ditambahkan ke konfigurasi helper kredensial.
Misalnya, untuk menambahkan region
us-central1
danasia-northeast1
, jalankan perintah:gcloud auth configure-docker us-central1-docker.pkg.dev,asia-northeast1-docker.pkg.dev
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
- Pelajari cara membangun aplikasi Java.
- Pelajari cara mem-build aplikasi Python.
- Pelajari cara mem-build aplikasi Go.
- Pelajari cara menyimpan artefak build di Cloud Storage.
- Pelajari cara menyimpan artefak build di Artifact Registry.
- Pelajari cara memecahkan masalah error build.