Cara Menggunakan Beberapa Konteks Bangun Docker untuk Merampingkan Perakitan Gambar

  • Post author:
  • Post category:Tutorial

Konsep

Docker tentang “membangun konteks” adalah salah satu karakteristiknya yang paling membatasi dan disalahpahami. Konteks build mendefinisikan file dan folder lokal yang dapat Anda rujuk di Dockerfile Anda. Konten di luarnya tidak dapat digunakan, yang sering kali menghalangi prosedur pembuatan yang rumit.

BuildKit v0.8 memperbaiki situasi ini dengan memungkinkan Anda menggunakan beberapa konteks dengan setiap pembangunan yang Anda lakukan. Ini memudahkan untuk mereferensikan file yang mungkin berada di lokasi yang benar-benar terpisah, seperti file dalam direktori kerja Anda dan ketergantungan pada URL jarak jauh.

Dalam artikel ini kami akan menjelaskan mengapa beberapa konteks build berguna dan bagaimana Anda dapat menggunakannya dengan rilis Docker CLI terbaru. Pertama, mari kita rekap apa itu konteks pembangunan dan mengapa begitu banyak orang mengalami masalah di masa lalu.

Tujuan Konteks Pembangunan

Docker berbasis daemon. Proses yang menjalankan pembuatan gambar Anda tidak bergantung pada proses CLI yang mengeluarkan perintah. Daemon dapat ditemukan di host jarak jauh yang tidak dapat secara langsung mengakses sistem file mesin Anda.

Konteks build mengacu pada file yang ditransfer ke daemon Docker saat build terjadi. Inilah sebabnya mengapa hanya konten dalam konteks yang dapat direferensikan oleh Dockerfile.

Anda Biasanya menjalankan docker build dengan . sebagai argumennya, yang menjadikan direktori kerja Anda sebagai konteks build:

docker build -t my-website:latest .

Ini mengizinkan referensi ke jalur apa pun di dalam direktori kerja Anda:

FROM httpd:latest COPY index.html /var/www/html/index .html

Anda tidak dapat menjangkau untuk menyalin apa pun di atas direktori kerja di sistem file Anda:

FROM httpd:latest 
COPY index.html /var/www/html/index.html 
COPY ../company-css/company.css /var/ www/html/company.css

Setiap file yang Anda perlukan dalam gambar penampung Anda harus ada di bawah satu direktori yang dapat Anda gunakan sebagai konteks pembangunan. Ini bisa menjadi masalah dalam situasi seperti yang ditunjukkan di atas, di mana Anda ingin menarik dependensi dari sumber yang tidak ada di pohon proyek Anda.

Menggunakan Beberapa Konteks Pembangunan

Konteks beberapa build sekarang didukung di BuildKit v0.8 dan yang lebih baru ketika Anda memilih- ke sintaks Dockerfile v1.4. Rilis ini dikirimkan dengan Docker CLI mulai dari versi 20.10.13. Anda seharusnya dapat menggunakannya hari ini jika menjalankan versi terbaru Docker.

Anda harus membuat gambar dengan BuildKit untuk menggunakan banyak konteks. Mereka tidak didukung oleh pembuat lawas. Gunakan perintah docker buildx build alih-alih build docker build:

$ docker buildx build -t my-website:latest .

Sekarang Anda dapat menggunakan flag –build-context untuk mendefinisikan beberapa konteks build bernama:

$ docker buildx build -t situs-saya: terbaru . --build-context company-css=../company-css --build-context company-js=../company-js

Sesuaikan Dockerfile Anda dengan konten referensi dari konteks ini:

#syntax=docker/dockerfile:1.4
FROM httpd:latest
COPY index.html /var/www/html/index.html
COPY --from=company-css /company.css /var/www/html/company.css
COPY --from=company-js /company.js /var/www/html/company.js

 

Ini mengilustrasikan bagaimana Anda dapat menyalin file dan folder yang berada di luar konteks build utama Anda, terlepas dari posisinya di pohon sistem file Anda.

Deklarasi sintaks Dockerfile v1.4 diperlukan untuk aktifkan dukungan untuk fitur tersebut. Anda kemudian dapat menggunakan opsi –from dengan instruksi TAMBAHKAN dan SALIN untuk menarik file dari konteks build bernama, sama halnya dengan mereferensikan sumber daya dalam tahap build sebelumnya.

Priority Order

Konteks beberapa build memodifikasi urutan resolusi sumber daya untuk flag –from. Docker sekarang akan mencocokkan kunci yang Anda berikan (–from=key) menggunakan prosedur berikut:

Cari set konteks build bernama dengan flag –build-context.Cari tahap build sebelumnya yang dibuat dengan FROM my-image:latest AS nama panggung.Buat tahap pembangunan sebaris baru menggunakan kunci yang diberikan sebagai gambar tahap.

Ini berarti Anda dapat menggunakan konteks bernama untuk mengganti dependensi jarak jauh yang ditentukan menggunakan tahap pembangunan.

Pertimbangkan contoh ini:

#syntax=docker/dockerfile:1.4
FROM my-org/company-scss:latest AS css
RUN sass company.scss company.css

FROM httpd:latest
COPY index.html /var/www/html/index.html
COPY --from=css /company.css /var/www/html/company.css

 

Image Docker ini menarik beberapa sumber daya jarak jauh dari image Docker bersama lainnya. Ini dapat membuat kesulitan ketika Anda menguji proyek Anda – mungkin ada bug dalam ketergantungan yang ingin Anda tambal dengan cepat. Konteks build

Named memungkinkan Anda mengganti nama panggung css untuk menyediakan file lokal sebagai gantinya:

$ docker buildx build - t situs web saya: terbaru . --build-context css=css/

Ini akan menyalin file css/company.css direktori kerja Anda ke dalam gambar akhir, alih-alih versi yang disediakan oleh my-org/company-scss:latest dependency.

Urutan resolusi berarti penggantian dapat diterapkan bahkan jika gambar Anda tidak menggunakan tahapan build bernama. Dengan mendefinisikan konteks pembangunan dengan nama yang sama dengan gambar, Dockerfile Anda akan menarik konten dari konteks itu, alih-alih image.

$ docker buildx build -t my-website:latest . --build-context my-org/company-scss:latest=css/

Named build contexts mendukung semua sumber yang sudah diterima oleh docker build:

–build-context my-context=../local/path – A path di sistem file Anda.

–build-context my-context=https://github.com/user/repo.git – Repositori Git jarak jauh.

–build-context my-context=https://example.com/data .tar – Tarball jarak jauh yang disediakan oleh server HTTP.

–build-context my-context=docker-image://busybox:latest – Konten dari image Docker lain.

Sumber jarak jauh lebih menyederhanakan penggantian ketergantungan. Anda dapat mengarahkan langsung ke repositori Git bercabang atau tag gambar Docker yang berbeda, sambil membiarkan Dockerfile Anda tidak berubah.

Mounting Files From a Build Context

Named build contexts bekerja dengan instruksi RUN juga. Anda dapat menggunakan –mount=from untuk menjalankan executable dari build lain context.

#syntax=docker/dockerfile:1.4
RUN --mount=from=name-of-build-context demo-executable

Ini memasang file tanpa menyalinnya ke lapisan saat ini, membantu meningkatkan kinerja. demo-executable tidak akan ada di gambar akhir.

Tepatnya Membangun Kembali Image

Kasus penggunaan lain untuk konteks build bernama menyangkut membangun kembali gambar di masa mendatang. Dockerfile dengan instruksi seperti FROM alpine:3.15 tidak sepenuhnya dapat direproduksi. Tag gambar dapat diubah sehingga alpine:3.15 mungkin berisi konten yang berbeda di masa mendatang, setelah patch baru dirilis. Ini berarti gambar yang dibuat ulang tidak dijamin akan menghasilkan lapisan yang sama seperti versi aslinya.

Anda dapat mengatasi masalah ini dengan memeriksa metadata bangunan pertama untuk menemukan gambar dasar persis yang digunakan:

$ docker buildx imagetools inspect --format `{ {json .BuildInfo}}` my-image:latest { ... "sources": [ { "type": "docker-image", "ref": "docker.io/library/alpine:3.15", "pin ": "sha256:4edbd2beb5f78b1014028f4fbb99f3237d9561100b6881aabbf5acce2c4f9454" } ] ... }

Sekarang Anda dapat menentukan konteks build bernama yang disebut alpine:3.15 yang menunjuk ke versi persis yang sebelumnya digunakan:

$ docker my-image:latest build -t . --build-context alpine:3.15=docker-image://[email protected]cce2c4f9454

Ini menyederhanakan pembuatan pembuatan ulang yang tepat dari gambar yang dibuat sebelumnya, tanpa harus memodifikasi Dockerfile.

Kesimpulan pohon direktori proyek. Mereka memecahkan tantangan kegunaan lama yang mungkin Anda alami dengan konteks build tunggal. Konteks build

Named memungkinkan Anda menyertakan dependensi out-of-tree dan melakukan penggantian ad-hoc. Mereka bekerja dengan baik bersama dengan tahapan build bernama Docker yang ada. Menggabungkan dua fitur membantu Anda membuat Dockerfile modular yang dapat dikustomisasi pada waktu build.

Anda dapat memulai dengan beberapa konteks build hari ini dengan memperbarui ke Docker 20.10.13 atau yang lebih baru dan menggunakan docker buildx untuk membuat gambar Anda. Distribusi BuildKit yang berdiri sendiri juga tersedia ketika Anda tidak ingin menginstal seluruh CLI Docker.

Itulah berita seputar Cara Menggunakan Beberapa Konteks Bangun Docker untuk Merampingkan Perakitan Gambar, semoga bermanfaat. Disadur dari HowToGeek.com.