Maži Docker vaizdai, kurie patikėjo savimi*

[nuoroda į amerikiečių pasaką vaikams „Mažas variklis, kuris galėtų“ – apytiksl. juosta]*

Maži Docker vaizdai, kurie patikėjo savimi*

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

Projektas Distroless siūlo pagrindinių „distroless“ vaizdų pasirinkimą, juose nėra paketų tvarkyklių, apvalkalų ir kitų paslaugų, kurias esate įpratę matyti komandinėje eilutėje. Dėl to naudokite paketų tvarkykles kaip 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 čia.

Projektas - čia.

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

Добавить комментарий