Eta Docker-bildoj, kiuj kredis je si mem*

[referenco al la usona infana fabelo "La Malgranda Motoro Kiu Povis" - ĉ. leno]*

Eta Docker-bildoj, kiuj kredis je si mem*

Kiel aŭtomate krei etajn bildojn de Docker por viaj bezonoj

Nekutima Obsedo

Dum la pasintaj du monatoj, mi obsedis kiom malgranda Docker-bildo povas esti kaj ankoraŭ havas la aplikaĵon funkcianta?

Mi komprenas, la ideo estas stranga.

Antaŭ ol mi eniros la detalojn kaj teknikaĵojn, mi ŝatus klarigi kial ĉi tiu problemo tiom ĝenis min, kaj kiel ĝi koncernas vin.

Kial grandeco gravas

Reduktante la enhavon de la bildo de Docker, ni tiel reduktas la liston de vundeblecoj. Aldone, ni faras la bildojn pli puraj, ĉar ili enhavas nur tion, kion oni bezonas por ruli aplikaĵojn.

Estas unu pli malgranda avantaĝo - bildoj estas elŝutitaj iom pli rapide, sed, laŭ mi, ĉi tio ne estas tiel grava.

Bonvolu noti: Se vi zorgas pri grandeco, la Alpaj aspektoj mem estas malgrandaj kaj verŝajne konvenos al vi.

Sendistroj bildoj

Projekto Distroless ofertas elekton de bazaj "sendistroj" bildoj, ili ne enhavas pakaĵadministrantojn, ŝelojn kaj aliajn ilojn, kiujn vi kutimas vidi sur la komandlinio. Kiel rezulto, uzu pakaĵadministrantojn kiel pip и apt ne funkcios:

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

Dockerfile uzante Python 3 distroless bildo

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 ne estas en la bildo

Kutime ĉi tiu problemo estas solvita per plurŝtupa konstruo:

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/

Multetapa asembleo

La rezulto estas bildo de 130MB en grandeco. Ne tro malbona! Por komparo: la defaŭlta Python-bildo pezas 929MB, kaj la "pli maldika" (3,7-slim) - 179MB, alpa bildo (3,7-alpine) estas 98,6MB, dum la baza sendistribua bildo uzata en la ekzemplo estas 50,9MB.

Estas juste atentigi, ke en la antaŭa ekzemplo ni kopias tutan dosierujon /usr/local/lib/python3.7/site-packages, kiu povas enhavi dependecojn kiujn ni ne bezonas. Kvankam estas klare, ke la granddiferenco de ĉiuj ekzistantaj bazbildoj de Python varias.

En la momento de la skribado, Google distroless ne subtenas multajn bildojn: Java kaj Python ankoraŭ estas en la eksperimenta stadio, kaj Python nur ekzistas por 2,7 kaj 3,5.

Malgrandaj bildoj

Reen al mia obsedo pri kreado de malgrandaj bildoj.

Ĝenerale, mi volis vidi kiel distroless bildoj estas konstruitaj. La distroless-projekto uzas la konstruilon de Guglo bazel. Tamen, instali Bazel kaj verki viajn proprajn bildojn postulis multe da laboro (kaj por esti honesta, reinventi la radon estas amuza kaj eduka). Mi volis simpligi la kreadon de pli malgrandaj bildoj: la ago krei bildon estu ege simpla, banala. Por ke ne estu agordaj dosieroj por vi, nur unu linio en la konzolo: просто собрать образ для <приложение>.

Do, se vi volas krei viajn proprajn bildojn, tiam sciu: ekzistas tia unika docker-bildo, scratch. Scratch estas "malplena" bildo, ne estas dosieroj en ĝi, kvankam ĝi pezas defaŭlte - wow! - 77 bajtoj.

FROM scratch

Grati bildon

La ideo de gratvunda bildo estas, ke vi povas kopii iujn ajn dependecojn de la gastiga maŝino en ĝin kaj aŭ uzi ilin ene de Dockerfile (ĉi tio estas kiel kopii ilin al apt kaj instali de nulo), aŭ poste kiam la Docker-bildo realiĝas. Ĉi tio ebligas al vi tute kontroli la enhavon de la Docker-ujo, kaj tiel tute kontroli la grandecon de la bildo.

Nun ni devas iel kolekti ĉi tiujn dependecojn. Ekzistantaj iloj kiel apt permesas al vi elŝuti pakaĵojn, sed ili estas ligitaj al la nuna maŝino kaj, finfine, ne subtenas Vindozon aŭ MacOS.

Do mi komencis konstrui mian propran ilon, kiu aŭtomate konstruus bazan bildon de la plej malgranda ebla grandeco kaj ankaŭ rulus ajnan aplikaĵon. Mi uzis Ubuntu/Debian-pakaĵojn, faris elekton (ricevante pakaĵojn rekte el la deponejoj) kaj rekursie trovis iliajn dependecojn. La programo devis aŭtomate elŝuti la plej novan stabilan version de la pako, minimumigante sekurecajn riskojn kiel eble plej multe.

Mi nomis la ilon fetchy, ĉar li... trovas kaj alportas... kion necesas [el la angla “porti”, “porti” - ĉ. lane]. La ilo funkcias per komandlinia interfaco, sed samtempe ofertas API.

Kunmeti bildon uzante fetchy (ni prenu Python-bildon ĉi-foje), vi nur bezonas uzi la CLI tiel: fetchy dockerize python. Eble oni petos vin pri la cela operaciumo kaj kodnomo ĉar fetchy nuntempe nur uzas pakaĵojn bazitajn sur Debian kaj Ubuntu.

Nun vi povas elekti kiuj dependecoj tute ne bezonas (en nia kunteksto) kaj ekskludi ilin. Ekzemple, Python dependas de Perl, kvankam ĝi funkcias bone sen Perl instalita.

Результаты

Python-bildo kreita per la komando fetchy dockerize python3.5 pezas nur 35MB (mi estas pli ol certa, ke estonte ĝi povas esti eĉ pli malpeza). Montriĝas, ke ni sukcesis forrazi aliajn 15 WW de la distroless bildo.

Vi povas vidi ĉiujn bildojn kolektitajn ĝis nun tie.

Projekto - tie.

Se vi mankas funkcioj, nur kreu peton - mi volonte helpos :) Eĉ pli, mi nuntempe laboras pri integri aliajn pakaĵadministrilojn en fetchy, por ke ne necesu plurŝtupaj konstruoj.

fonto: www.habr.com

Aldoni komenton