[referenco al la usona infana fabelo "La Malgranda Motoro Kiu Povis" - ĉ. leno]*
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
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
Projekto -
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