Wadah memungkinkan Anda untuk mengemas aplikasi Anda dengan cara portabel yang dapat berjalan di banyak lingkungan. Platform kontainer paling populer adalah Docker.
Tutorial ini akan menjelaskan cara menggunakan cache build Docker untuk keuntungan Anda.
Cache Pembuatan Docker
Membangun citra harus cepat, efisien, dan dapat diandalkan. Konsep gambar Docker hadir dengan lapisan yang tidak dapat diubah. Setiap perintah yang Anda jalankan menghasilkan lapisan baru yang berisi perubahan dibandingkan dengan lapisan sebelumnya.
Semua lapisan yang dibangun sebelumnya di-cache dan dapat digunakan kembali. Namun, jika penginstalan Anda bergantung pada sumber daya eksternal, cache Docker dapat menyebabkan masalah.
Cara Memanfaatkan Cache Build Docker
Untuk memahami masalah build-cache Docker, mari buat aplikasi nginx Docker kustom sederhana. Sebelum Anda membuat image, buat Dockerfile yang memperbarui library dan menambahkan halaman awal kustom:
FROM nginx:1.21.6
# Update all packages
RUN apt-get update && apt-get -y upgrade
# Use a custom startpage
RUN echo '<html><bod>My Custom Startpage</body></html>' > /usr/share/nginx/html/index.html
Anda sekarang dapat membuat image Docker:
$ docker build -t my-custom-nginx .
=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e12... 5.8s
=> [2/3] RUN apt-get update && apt-get -y upgrade 3.6s
=> [3/3] RUN echo '<html><bod>My Custom Startpage... 0.2s
=> exporting to image 0.1s
=> exporting layers 0.1s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
[+] Building 11.3s (7/7) FINISHED
Dalam contoh ini, saya menghapus beberapa output agar mudah dibaca. Jika Anda membuat gambar untuk pertama kali, Anda akan melihat bahwa itu membutuhkan waktu yang cukup lama, dalam kasus saya 11.3s
.
Satu langkah eksekusi yang panjang adalah apt-get update && apt-get -y upgrade
tergantung pada berapa banyak dependensi yang diperbarui dan seberapa cepat kecepatan internet Anda. Ia memeriksa pembaruan paket pada sistem operasi dan menginstalnya jika tersedia.
Sekarang, Anda menjalankannya lagi, dan Anda mendapat manfaat dari cache build Docker:
$ docker build -t my-custom-nginx .
=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e1211ac1… 0.0s
=> CACHED [2/3] RUN apt-get update && apt-get -y upgrade 0.0s
=> CACHED [3/3] RUN echo '<html><bod>My Custom Startpage... 0.0s
=> exporting to image 0.0s
=> exporting layers 0.0s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
Building 1.1s (7/7) FINISHED
Kali ini, pembuatan gambar sangat cepat karena dapat menggunakan kembali semua gambar yang dibuat sebelumnya. Saat Anda menyesuaikan halaman awal Anda di Dockerfile, Anda melihat bagaimana perilaku caching terpengaruh:
FROM nginx:1.21.6
# Update all packages
RUN apt-get update && apt-get -y upgrade
# Use a custom startpage
RUN echo '<html><bod>New Startpage</body></html>' > /usr/share/nginx/html/index.html
Sekarang, buat gambar lagi:
$ docker build -t my-custom-nginx .
=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e1211ac1… 0.0s
=> CACHED [2/3] RUN apt-get update && apt-get -y upgrade 0.0s
=> [3/3] RUN echo '<html><bod>My Custom Startpage... 0.2s
=> exporting to image 0.0s
=> exporting layers 0.0s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
Building 2.1s (7/7) FINISHED
Kali ini hanya membangun kembali lapisan terakhir karena mengenali bahwa RUN
perintah telah berubah. Namun, itu menggunakan kembali langkah pembangunan ke-2 yang intens dan tidak memperbarui dependensi sistem operasi.
Perilaku caching cerdas. Setelah 1 langkah perlu dibangun kembali, setiap langkah berikutnya dibangun kembali. Oleh karena itu, ada baiknya untuk meletakkan bagian yang sering berubah di akhir Dockerfile
untuk menggunakan kembali lapisan build sebelumnya.
Namun, mungkin Anda ingin memaksa membangun kembali lapisan yang di-cache untuk memaksa pembaruan paket. Memaksa pembangunan kembali mungkin diperlukan karena Anda ingin menjaga keamanan aplikasi Anda dan menggunakan pembaruan terbaru jika tersedia.
Cara Menggunakan --no-cache
Build Docker Opsi
Mungkin ada alasan berbeda untuk menonaktifkan build-cache. Anda dapat membangun kembali gambar dari gambar dasar tanpa menggunakan lapisan yang di-cache dengan menggunakan --no-cache
pilihan.
$ docker build -t my-custom-nginx .
=> CACHED [1/3] FROM docker.io/library/nginx:1.21.6@sha256:... 0.0s
=> [2/3] RUN apt-get update && apt-get -y upgrade 3.5s
=> [3/3] RUN echo '<html><bod>My Custom Startpage... 0.2s
=> exporting to image 0.1s
=> exporting layers 0.0s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
Building 5.5s (7/7) FINISHED
Lapisan baru dibangun dan digunakan. docker build
menjalankan kedua perintah kali ini, yang datang dengan pendekatan semua atau tidak sama sekali. Entah Anda memberikan --no-cache
opsi yang mengeksekusi semua perintah, atau Anda akan menyimpan cache sebanyak mungkin.
Cara Menggunakan Argumen Docker untuk Cache-Busting
Opsi lain memungkinkan memberikan titik awal kecil di Dockerfile. Anda perlu mengedit Dockerfile Anda seperti ini:
FROM nginx:1.21.6
# Update all packages
RUN apt-get update && apt-get -y upgrade
# Custom cache invalidation
ARG CACHEBUST=1
# Use a custom startpage
RUN echo '<html><bod>New Startpage</body></html>' > /usr/share/nginx/html/index.html
Anda menambahkan CACHEBUST
argumen ke Dockerfile Anda di lokasi yang ingin Anda bangun kembali. Sekarang, Anda dapat membuat image Docker dan memberikan nilai yang selalu berbeda yang menyebabkan semua perintah berikut dijalankan kembali:
$ docker build -t my-custom-nginx --build-arg CACHEBUST=$(date +%s) .
=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e1211ac1... 0.0s
=> CACHED [2/3] RUN apt-get update && apt-get -y upgrade 0.0s
=> [3/3] RUN echo '<html><bod>My Custom Startpage... 0.3s
=> exporting to image 0.0s
=> exporting layers 0.0s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
Building 1.0s (7/7) FINISHED
Dengan memberikan --build-arg CACHEBUST=$(date +%s)
, Anda menyetel parameter ke nilai yang selalu berbeda yang menyebabkan semua lapisan berikut dibangun kembali.