Gambar Tiny Docker yang percaya pada diri mereka sendiri *

[rujukan dongeng anak-anak Amerika "The Little Engine That Could" - kira-kira. per.] *



Cara otomatis membuat gambar buruh pelabuhan kecil untuk kebutuhan Anda


Obsesi yang tidak biasa


Selama beberapa bulan terakhir saya telah terobsesi dengan obsesi: seberapa banyak saya dapat mengurangi gambar Docker sehingga aplikasi berfungsi?


Saya mengerti idenya aneh.


Sebelum mempelajari detail dan masalah teknis, saya ingin menjelaskan mengapa masalah ini sangat mengaitkan saya dan bagaimana hal itu mengkhawatirkan Anda.


Mengapa ukuran itu penting?


Dengan memperpendek konten gambar Docker, kami memperpendek daftar kerentanan. Selain itu, kami membuat gambar lebih bersih, karena hanya berisi apa yang Anda perlukan untuk menjalankan aplikasi.


Ada keuntungan kecil lainnya - unduhan gambar sedikit lebih cepat, tetapi, bagi saya, ini tidak begitu penting.


Harap dicatat: Jika Anda peduli tentang ukuran, penampilan Alpine itu kecil dan mungkin cocok untuk Anda.

Gambar tidak distro


Proyek Distroless menawarkan pilihan gambar "distroless" dasar, mereka tidak mengandung manajer paket, shell, atau utilitas lain yang biasa Anda lihat di baris perintah. Akibatnya, menggunakan manajer paket seperti pip dan apt akan gagal:


 FROM gcr.io/distroless/python3 RUN pip3 install numpy 

Dockerfile menggunakan gambar Python 3 distroless


 Sending build context to Docker daemon 2.048kB Step 1/2 : FROM gcr.io/distroless/python3 ---> 556d570d5c53 Step 2/2 : RUN pip3 install numpy ---> Running in dbfe5623f125 /bin/sh: 1: pip3: not found 

Tidak ada pip di gambar


Biasanya, masalah ini diselesaikan oleh pembangunan multi-tahap:


 FROM python:3 as builder RUN pip3 install numpy FROM gcr.io/distroless/python3 COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.5/ 

Perakitan multi-tahap


Hasilnya adalah gambar berukuran 130MB. Tidak terlalu buruk! Sebagai perbandingan: gambar Python secara default memiliki berat 929MB, dan gambar "lebih tipis" ( 3,7-slim ) - 179MB, gambar alpine ( 3,7-alpine ) - 98,6MB, sedangkan gambar distroless dasar yang digunakan dalam contoh adalah 50,9MB.


Kami dapat dengan tepat menunjukkan bahwa dalam contoh sebelumnya, kami menyalin seluruh direktori /usr/local/lib/python3.7/site-packages , yang mungkin berisi dependensi yang tidak perlu bagi kami. Meskipun jelas bahwa perbedaan ukuran semua gambar dasar Python yang ada bervariasi.


Pada saat menulis baris-baris ini, Google distroless tidak mendukung banyak gambar: Java dan Python masih pada tahap percobaan, dan Python hanya ada untuk 2,7 dan 3,5.

Gambar kecil


Mari kita kembali ke obsesi saya dengan membuat gambar kecil.


Sebenarnya, saya ingin melihat cara kerja gambar yang tidak jelas. Proyek distroless menggunakan alat bazel build Google. Namun, untuk menginstal Bazel dan menulis gambar Anda sendiri, saya harus berkeringat (dan harus benar-benar jujur, menciptakan kembali roda itu menyenangkan dan informatif). Saya ingin menyederhanakan pembuatan gambar yang dikurangi: tindakan membuat gambar harus sangat sederhana, dangkal . Agar Anda tidak memiliki file konfigurasi apa pun, hanya satu baris di konsol: <> .


Jadi, jika Anda ingin membuat gambar Anda sendiri, maka ketahuilah: ada gambar buruh pelabuhan yang unik, scratch . Scratch adalah gambar "kosong", tidak memiliki file, meskipun beratnya secara default - wow! - 77 byte.


 FROM scratch 

Gambar awal


Gagasan dari gambar awal adalah bahwa Anda dapat menyalin dependensi dari mesin host ke dalamnya dan menggunakannya di dalam Dockerfile (ini adalah cara menyalinnya untuk apt dan instal dari awal), atau nanti, ketika gambar Docker terwujud. Ini memungkinkan Anda untuk sepenuhnya mengontrol isi wadah Docker, dan, dengan demikian, sepenuhnya mengontrol ukuran gambar.


Dan sekarang kita perlu mengumpulkan dependensi ini. Alat yang ada seperti apt memungkinkan Anda untuk mengunduh paket, tetapi terikat dengan mesin saat ini dan, pada akhirnya, tidak mendukung Windows atau MacOS.


Dan jadi saya berusaha untuk merakit alat saya sendiri, yang secara otomatis akan mengumpulkan gambar dasar dari ukuran sekecil mungkin dan sehingga masih akan meluncurkan aplikasi apa pun. Saya menggunakan paket Ubuntu / Debian, membuat pilihan (mendapatkan paket langsung dari repositori) dan secara rekursif menemukan dependensinya. Program harus secara otomatis mengunduh versi stabil terbaru dari paket, meminimalkan risiko keamanan.


Saya menyebut fetchy , karena ... menemukan dan membawa ... apa yang Anda butuhkan [ dari bahasa Inggris. "ambil", "bawa" - kira-kira. trans. ] Alat ini berfungsi melalui antarmuka baris perintah, tetapi pada saat yang sama menawarkan API.


Untuk membuat gambar menggunakan fetchy (mari kita ambil gambar Python kali ini), Anda hanya perlu menggunakan CLI seperti ini: fetchy dockerize python . Anda mungkin ditanya mengenai sistem operasi target dan nama kode, karena fetchy hanya menggunakan paket-paket berbasis Debian dan Ubuntu.


Sekarang Anda dapat memilih dependensi mana yang tidak diperlukan sama sekali (dalam konteks kami) dan mengecualikan mereka. Sebagai contoh, Python tergantung pada perl, meskipun ia bekerja dengan baik tanpa Perl diinstal.


Hasil


Gambar Python yang dibuat dengan fetchy dockerize python3.5 hanya berbobot 35MB (saya lebih yakin bahwa itu dapat dibuat lebih mudah di masa depan). Ternyata dengan gambar yang tidak distro kami berhasil "mencukur" 15MB lainnya.


Semua gambar yang dikumpulkan saat ini dapat dilihat di sini .


Proyeknya ada di sini .


Jika Anda tidak memiliki cukup fungsi, cukup buat aplikasi - Saya akan dengan senang hati membantu :) Terlebih lagi, saya saat ini sedang mengerjakan integrasi manajer paket lain menjadi lebih menarik, sehingga kebutuhan untuk pembangunan multi-tahap tidak lagi diperlukan.

Source: https://habr.com/ru/post/id469947/


All Articles