[rujukan kana dongéng barudak Amérika "The Little Engine That Could" - approx. jalur]*

Kumaha cara otomatis nyiptakeun gambar Docker leutik pikeun kabutuhan anjeun
Obsesi anu teu biasa
Salila sababaraha bulan kapengker, kuring obsessed kumaha leutikna gambar Docker tiasa sareng masih tiasa ngajalankeun aplikasi?
Kuring ngarti, idena aneh.
Sateuacan kuring lebet kana detil sareng téknis, kuring hoyong ngajelaskeun naha masalah ieu ngaganggu kuring pisan, sareng kumaha masalah anjeun.
Naha ukuran penting
Ku ngirangan eusi gambar Docker, kami ngirangan daptar kerentanan. Salaku tambahan, kami ngajantenkeun gambar langkung bersih, sabab ngan ukur ngandung naon anu diperyogikeun pikeun ngajalankeun aplikasi.
Aya hiji deui kaunggulan leutik - gambar diundeur saeutik gancang, tapi, dina pamanggih kuring, ieu teu jadi penting.
Punten perhatikeun: Upami anjeun prihatin ngeunaan ukuran, Alpine katingalina alit sareng sigana bakal cocog sareng anjeun.
Gambar distroless
nawarkeun pilihan dasar "distroless" gambar, aranjeunna henteu ngandung manajer pakét, cangkang jeung Utiliti séjén nu biasa ningali dina garis paréntah. Hasilna, make manajer pakét kawas pip и apt moal jalan:
FROM gcr.io/distroless/python3
RUN pip3 install numpy
Dockerfile ngagunakeun Python 3 gambar 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
Pip henteu dina gambar
Biasana masalah ieu direngsekeun ku ngawangun 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/
assembly multi-tahap
Hasilna nyaéta gambar ukuranana 130MB. Teu goréng teuing! Pikeun babandingan: gambar Python standar beuratna 929MB, sareng anu "leuwih tipis" (3,7-slim) - 179MB, gambar alpine (3,7-alpine) nyaéta 98,6MB, sedengkeun gambar distroless dasar anu dianggo dina conto nyaéta 50,9MB.
Éta adil pikeun nunjuk kaluar yén dina conto saméméhna urang nyalin hiji sakabéh diréktori /usr/local/lib/python3.7/site-packages, nu bisa ngandung kagumantungan nu urang teu butuh. Sanajan eta jelas yén bédana ukuran sadaya gambar dasar Python aya variasina.
Dina waktos nyerat, Google distroless henteu ngadukung seueur gambar: Java sareng Python masih dina tahap ékspérimén, sareng Python ngan ukur aya pikeun 2,7 sareng 3,5.
Gambar leutik
Deui ka obsesi kuring nyieun gambar leutik.
Sacara umum, kuring hoyong ningali kumaha gambar distroless diwangun. Proyék distroless ngagunakeun alat ngawangun Google bazel. Nanging, masang Bazel sareng nyerat gambar anjeun nyalira nyandak seueur padamelan (sareng jujur, nyiptakeun deui roda mangrupikeun hiburan sareng pendidikan). Abdi hoyong nyederhanakeun nyiptakeun gambar anu langkung alit: tindakan nyiptakeun gambar kedah saderhana pisan, banal. Janten teu aya file konfigurasi pikeun anjeun, ngan ukur hiji garis dina konsol: просто собрать образ для <приложение>.
Janten, upami anjeun hoyong nyiptakeun gambar anjeun nyalira, maka terang: aya gambar docker anu unik, scratch. Scratch mangrupikeun gambar "kosong", teu aya file di jerona, sanaos beuratna sacara standar - wow! - 77 bait.
FROM scratch
Gambar goresan
Gagasan gambar goresan nyaéta yén anjeun tiasa nyalin katergantungan tina mesin host kana éta sareng nganggo éta di jero Dockerfile (ieu sapertos nyalin kana. apt tur masang ti scratch), atanapi engké nalika gambar Docker ieu materialized. Ieu ngidinan Anjeun pikeun sakabéhna ngadalikeun eusi wadahna Docker, sahingga lengkep ngadalikeun ukuran gambar.
Ayeuna urang kedah kumaha waé ngumpulkeun kagumantungan ieu. Alat anu aya sapertos apt ngamungkinkeun anjeun pikeun ngaunduh pakét, tapi éta dihijikeun kana mesin ayeuna sareng, pamustunganana, henteu ngadukung Windows atanapi MacOS.
Janten abdi mutuskeun pikeun ngadamel alat nyalira anu sacara otomatis bakal ngawangun gambar dasar kalayan ukuran pangleutikna sareng ngajantenkeun éta tiasa ngajalankeun aplikasi naon waé. Abdi nganggo pakét Ubuntu/Debian, ngalakukeun pamilihan (ngambil paket langsung tina repositori) sareng sacara rekursif mendakan dependensi na. Program ieu sakuduna otomatis ngaunduh vérsi stabil pangénggalna tina paket, ngaminimalkeun résiko kaamanan.
Kuring ngaranna alat fetchy, sabab anjeunna ... manggihan jeung mawa ... naon diperlukeun [ti basa Inggris "Nyandak", "mawa" - kira-kira. jalur]. Alatna dianggo ngaliwatan antarmuka garis paréntah, tapi dina waktos anu sami nawiskeun API.
Pikeun ngumpul gambar ngagunakeun fetchy (Hayu urang nyandak gambar Python waktos ieu), anjeun ngan ukur kedah nganggo CLI sapertos kieu: fetchy dockerize python. Anjeun bisa jadi dipenta pikeun sistem operasi target na codename sabab fetchy ayeuna ngan ukur nganggo pakét dumasar kana Debian и Ubuntu.
Ayeuna anjeun tiasa milih dependensi mana anu henteu diperyogikeun pisan (dina kontéks kami) sareng ngaluarkeunana. Contona, Python gumantung kana perl, sanajan gawéna rupa tanpa Perl dipasang.
Hasil
Gambar Python dijieun maké paréntah fetchy dockerize python3.5 beuratna ngan 35MB (Kuring leuwih ti yakin yén dina mangsa nu bakal datang bisa dijieun malah torek). Tétéla urang junun nyukur kaluar sejen 15 WW tina gambar distroless.
Anjeun tiasa ningali sadaya gambar anu dikumpulkeun dugi ka ayeuna .
Proyék - .
Mun anjeun leungit fitur, ngan nyieun pamundut a - Kuring bakal senang pikeun mantuan :) Komo deui, Kuring keur ayeuna dipake dina ngahijikeun manajer pakét séjén kana fetchy, ku kituna teu perlu pikeun multi-tahap ngawangun.
sumber: www.habr.com
