Kondisi berikut harus dipenuhi:
Terserah Anda untuk menemukan alat otomatisasi yang paling sesuai dengan kebutuhan Anda. Kami merekomendasikan penggunaan sistem CI/CD modern seperti alur kerja GitHub atau GitLab CI. Karena kami (penulis) menggunakan GitLab CI, contoh berikut disesuaikan dengan platform khusus ini, namun prinsip dasarnya harus berlaku di mana pun dan contoh dibuat cukup sederhana, sehingga Anda dapat mengikutinya, bahkan tanpa perlu menggunakan GitLab CI. pengalaman sebelumnya dengan platform khusus ini. Jika ragu, kunjungi halaman referensi gitlab-ci.yml untuk gambaran menyeluruh tentang kata kunci GitLab CI.
gitlab-ci.yml:
# define a job for building the containers
build-container :
stage : container-build
# run parallel builds for the desired architectures
parallel :
matrix :
- ARCH : amd64
- ARCH : arm64
tags :
# run each build on a suitable, preconfigured runner (must match the target architecture)
- runner-${ARCH}
image :
name : gcr.io/kaniko-project/executor:debug
entrypoint : [""]
script :
# build the container image for the current arch using kaniko
- >-
/kaniko/executor --context "${CI_PROJECT_DIR}" --dockerfile
"${CI_PROJECT_DIR}/Dockerfile" # push the image to the GitLab container
registry, add the current arch as tag. --destination
"${CI_REGISTRY_IMAGE}:${ARCH}"
gitlab-ci.yml:
# define a job for creating and pushing a merged manifest
merge-manifests :
stage : container-build
# all containers must be build before merging them
# alternatively the job may be configured to run in a later stage
needs :
- job : container-build
artifacts : false
tags :
# may run on any architecture supported by manifest-tool image
- runner-xyz
image :
name : mplatform/manifest-tool:alpine
entrypoint : [""]
script :
- >-
manifest-tool # authorize against your container registry
--username=${CI_REGISTRY_USER} --password=${CI_REGISTRY_PASSWORD} push
from-args # define the architectures you want to merge --platforms
linux/amd64,linux/arm64 # "ARCH" will be automatically replaced by
manifest-tool # with the appropriate arch from the platform definitions
--template ${CI_REGISTRY_IMAGE}:ARCH # The name of the final, combined
image which will be pushed to your registry --target ${CI_REGISTRY_IMAGE}
Demi kesederhanaan, kami sengaja menahan diri untuk tidak menggunakan gambar berversi yang diberi tag (semua build akan diberi tag sebagai "terbaru") pada contoh sebelumnya, karena kami merasa ini menambah banyak kode khusus platform dan alur kerja.
Namun demikian, bagi siapa pun yang tertarik dengan cara kami menangani pembuatan versi (dinamis) di GitLab, berikut adalah ikhtisar singkatnya:
CI_COMMIT_TAG
yang telah ditentukan sebelumnya di GitLab saat menjalankan saluran tag.needs
dari pekerjaan membangun dan menggabungkan sesuai), yang akan mengatur tag ke latest
ketika dijalankan pada cabang default, ke hash penerapan saat dijalankan di cabang lain dan ke tag rilis saat dijalankan di saluran tag.gitlab-ci.yml:
container-get-tag :
stage : pre-container-build-stage
tags :
- runner-xyz
image : busybox
script :
# All other branches are tagged with the currently built commit SHA hash
- |
# If pipeline runs on the default branch: Set tag to "latest"
if test "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH"; then
tag="latest"
# If pipeline is a tag pipeline, set tag to the git commit tag
elif test -n "$CI_COMMIT_TAG"; then
tag="$CI_COMMIT_TAG"
# Else set the tag to the git commit sha
else
tag="$CI_COMMIT_SHA"
fi
- echo "tag=$tag" > build.env
# parse tag to the build and merge jobs.
# See: https://docs.gitlab.com/ee/ci/variables/#pass-an-environment-variable-to-another-job
artifacts :
reports :
dotenv : build.env
Alat serupa meliputi:
Semua alat ini membuat gambar container dengan pendekatan berbeda.
BuildKit (dan img
) dapat berfungsi sebagai pengguna non-root dari dalam container tetapi memerlukan seccomp dan AppArmor dinonaktifkan untuk membuat container bersarang. kaniko
sebenarnya tidak membuat container bersarang, sehingga tidak memerlukan seccomp dan AppArmor untuk dinonaktifkan. BuildKit mendukung kontainer multi-lengkungan "cross-building" dengan memanfaatkan QEMU.
orca-build
bergantung pada runc
untuk membuat image dari Dockerfiles, yang tidak dapat dijalankan di dalam container (untuk alasan yang mirip dengan img
di atas). kaniko
tidak menggunakan runc
sehingga tidak memerlukan penggunaan teknik namespace kernel. Namun, orca-build
tidak memerlukan Docker atau daemon dengan hak istimewa apa pun (sehingga pembangunan dapat dilakukan seluruhnya tanpa hak istimewa).
umoci
bekerja tanpa hak istimewa apa pun, dan juga tidak memiliki batasan pada sistem file root yang sedang diekstraksi (meskipun memerlukan penanganan tambahan jika sistem file Anda cukup rumit). Namun, ia tidak memiliki alat pembangunan seperti Dockerfile
(ini adalah alat tingkat yang sedikit lebih rendah yang dapat digunakan untuk membangun pembuat seperti itu -- seperti orca-build
).
Buildah
berspesialisasi dalam membangun citra OCI. Perintah Buildah mereplikasi semua perintah yang ditemukan di Dockerfile. Hal ini memungkinkan pembuatan image dengan dan tanpa Dockerfiles tanpa memerlukan hak akses root apa pun. Tujuan utama Buildah adalah menyediakan antarmuka coreutils tingkat rendah untuk membuat gambar. Fleksibilitas pembuatan image tanpa Dockerfiles memungkinkan integrasi bahasa skrip lain ke dalam proses pembuatan. Buildah mengikuti model fork-exec sederhana dan tidak dijalankan sebagai daemon tetapi didasarkan pada API komprehensif di golang, yang dapat dijual ke alat lain.
FTL
dan Bazel
bertujuan untuk mencapai pembuatan image Docker secepat mungkin untuk subset image. Ini dapat dianggap sebagai "jalur cepat" kasus khusus yang dapat digunakan bersama dengan dukungan untuk Dockerfiles umum yang disediakan kaniko.
grup Google pengguna kaniko
Untuk Berkontribusi pada kaniko, lihat DEVELOPMENT.md dan CONTRIBUTING.md.
Saat mengambil snapshot, algoritme hashing kaniko menyertakan (atau dalam kasus --snapshot-mode=time
, hanya gunakan) mtime
file untuk menentukan apakah file telah berubah. Sayangnya, ada penundaan antara saat perubahan pada file dilakukan dan saat mtime
diperbarui. Artinya:
--snapshot-mode=time
), kaniko mungkin melewatkan seluruh perubahan yang diperkenalkan oleh perintah RUN
.--snapshot-mode=full
), apakah kaniko akan menambahkan lapisan atau tidak jika perintah RUN
memodifikasi file tetapi isinya tidak berubah secara teoritis non-deterministik. Hal ini tidak mempengaruhi isi yang masih benar, namun mempengaruhi jumlah lapisan.Perlu dicatat bahwa isu-isu tersebut saat ini hanya bersifat teoritis. Jika Anda melihat masalah ini terjadi, silakan buka masalah tersebut.
--chown
dukungan Kaniko saat ini mendukung perintah COPY --chown
dan ADD --chown
Dockerfile. Itu tidak mendukung RUN --chown
.