[nuoroda į amerikiečių pasaką vaikams „Mažas variklis, kuris galėtų“ – apytiksl. juosta]*
Kaip automatiškai sukurti mažus „Docker“ vaizdus pagal jūsų poreikius
Neįprasta apsėdimas
Pastaruosius porą mėnesių buvau apsėstas, koks mažas gali būti „Docker“ vaizdas ir vis dar veikia programa?
Suprantu, mintis keista.
Prieš įsigilindamas į detales ir techninius dalykus, norėčiau paaiškinti, kodėl ši problema mane taip vargino ir kaip ji rūpi jums.
Kodėl dydis svarbus
Sumažindami Docker vaizdo turinį, taip sumažiname pažeidžiamumų sąrašą. Be to, padarome vaizdus švaresnius, nes juose yra tik tai, ko reikia programoms paleisti.
Yra dar vienas nedidelis privalumas – vaizdai atsisiunčiami šiek tiek greičiau, bet, mano nuomone, tai nėra taip svarbu.
Atkreipkite dėmesį: jei nerimaujate dėl dydžio, Alpine išvaizda yra maža ir greičiausiai jums tiks.
Distroless vaizdai
pip
и apt
neveiks:
FROM gcr.io/distroless/python3
RUN pip3 install numpy
Dockerfile naudojant Python 3 distroless vaizdą
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
Pipo nuotraukoje nėra
Paprastai ši problema išsprendžiama kelių etapų kūrimu:
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/
Daugiapakopis surinkimas
Rezultatas yra 130 MB dydžio vaizdas. Neblogai! Palyginimui: numatytasis Python vaizdas sveria 929 MB, o „plonesnis“ (3,7-slim
) - 179 MB, alpinis vaizdas (3,7-alpine
) yra 98,6 MB, o pagrindinis pavyzdyje naudojamas vaizdas be distro yra 50,9 MB.
Sąžininga pažymėti, kad ankstesniame pavyzdyje kopijuojame visą katalogą /usr/local/lib/python3.7/site-packages
, kuriame gali būti mums nereikalingų priklausomybių. Nors akivaizdu, kad visų esamų Python bazinių vaizdų dydžio skirtumas skiriasi.
Rašymo metu „Google distroless“ nepalaiko daug vaizdų: „Java“ ir „Python“ vis dar yra eksperimento stadijoje, o „Python“ egzistuoja tik 2,7 ir 3,5 versijoms.
Maži vaizdai
Grįžtu prie mano manijos kurti mažus vaizdus.
Apskritai norėjau pamatyti, kaip konstruojami distroless vaizdai. Distroless projektas naudoja „Google“ kūrimo įrankį bazel
. Tačiau „Bazel“ įdiegimas ir savo vaizdų rašymas pareikalavo daug darbo (ir, tiesą sakant, išradinėti dviratį yra smagu ir mokoma). Norėjau supaprastinti mažesnių vaizdų kūrimą: įvaizdžio kūrimo veiksmas turi būti labai paprastas, banalus. Kad jums nebūtų konfigūracijos failų, konsolėje tik viena eilutė: просто собрать образ для <приложение>
.
Taigi, jei norite sukurti savo vaizdus, žinokite: yra toks unikalus dokerio vaizdas, scratch
. Scratch yra „tuščias“ vaizdas, jame nėra failų, nors jis sveria pagal numatytuosius nustatymus - oho! - 77 baitai.
FROM scratch
Įbrėžtas vaizdas
Įbrėžto vaizdo idėja yra ta, kad galite nukopijuoti bet kokias priklausomybes iš pagrindinio kompiuterio į jį ir naudoti jas Docker faile (tai panašu į jų kopijavimą į apt
ir įdiegti nuo nulio) arba vėliau, kai bus sukurtas Docker vaizdas. Tai leidžia visiškai valdyti Docker konteinerio turinį ir taip visiškai valdyti vaizdo dydį.
Dabar turime kažkaip surinkti šias priklausomybes. Esami įrankiai, pvz apt
leidžia atsisiųsti paketus, tačiau jie yra susieti su dabartine mašina ir juk nepalaiko Windows ar MacOS.
Taigi nusprendžiau sukurti savo įrankį, kuris automatiškai sukurtų mažiausio įmanomo dydžio pagrindinį vaizdą ir paleistų bet kokią programą. Naudojau Ubuntu/Debian paketus, pasirinkau (paketų gavau tiesiai iš saugyklų) ir rekursyviai radau jų priklausomybes. Programa turėjo automatiškai atsisiųsti naujausią stabilią paketo versiją, kiek įmanoma sumažindama saugumo riziką.
Įrankį pavadinau fetchy
, nes jis... randa ir atneša... ko reikia [iš anglų kalbos „atnešti“, „atnešti“ - apytiksliai. juosta]. Įrankis veikia per komandinės eilutės sąsają, tačiau tuo pat metu siūlo API.
Norėdami surinkti vaizdą naudodami fetchy
(šį kartą paimkime Python vaizdą), jums tiesiog reikia naudoti CLI taip: fetchy dockerize python
. Jūsų gali būti paprašyta nurodyti tikslinę operacinę sistemą ir kodinį pavadinimą, nes fetchy
šiuo metu naudoja tik paketus, pagrįstus Debian ir Ubuntu.
Dabar galite pasirinkti, kurios priklausomybės visai nereikalingos (mūsų kontekste) ir jas neįtraukti. Pavyzdžiui, Python priklauso nuo perl, nors veikia gerai ir neįdiegęs Perl.
rezultatai
Python vaizdas sukurtas naudojant komandą fetchy dockerize python3.5
sveria tik 35MB (esu daugiau nei tikras, kad ateityje bus galima padaryti dar lengvesnį). Pasirodo, mums pavyko nusiskusti dar 15 WW nuo distroless vaizdo.
Galite pamatyti visus iki šiol surinktus vaizdus
Projektas -
Jei trūksta funkcijų, tiesiog sukurkite užklausą - mielai padėsiu :) Dar daugiau, šiuo metu dirbu su kitų paketų tvarkytuvų integravimu į fetchy, kad nereikėtų kelių etapų statybų.
Šaltinis: www.habr.com