[referenca e njĂ« pĂ«rralle amerikane pĂ«r fĂ«mijĂ« âTreni i vogĂ«l qĂ« besonte nĂ« veteâ (âThe Little Engine That Couldâ) â shĂ«nim i pĂ«rkthyesit]*

Si të krijoni automatikisht imazhe të vogla docker për nevojat tuaja
Një obsesion i pazakontë
Dy muajt e fundit kam qenë i obsesionuar me një ide: sa mund të zvogëlohet imazhi Docker, që aplikacioni të funksionojë?
E kuptoj, ideja është e çuditshme.
Para se të thellohem në detaje dhe nënçka teknike, do të doja të shpjegoja se çfarë e bëri këtë problem të krijojë interesim për mua dhe si lidhet me ju.
Pse ka rëndësi madhësia
Duke zvogëluar përmbajtjen e imazhit Docker, gjithashtu zvogëlojmë listën e dobësive. Për më tepër, ne e bëjmë imazhin më të pastër, pasi përmban vetëm atë që është e nevojshme për të drejtuar aplikacionet.
Ka njĂ« avantazh tjetĂ«r tĂ« vogĂ«l â imazhet shkarkohen pak a shumĂ« mĂ« shpejt, por sipas meje, kjo nuk Ă«shtĂ« aq e rĂ«ndĂ«sishme.
Vini re: Nëse ju shqetëson madhësia, imazhet Alpine janë në vetvete të vogla dhe sigurisht do t'ju përshtaten.
Imazhet Distroless
ofron një koleksion imazhesh bazë "distroless", të cilat nuk përmbajnë menaxherë paketash, shell dhe utilitete të tjera që jeni mësuar të shihni në linjën e komandave. Si rezultat, përdorimi i menaxherëve të paketave si pip dhe apt nuk do të jetë i mundur:
FROM gcr.io/distroless/python3
RUN pip3 install numpyDockerfile që përdor imazhin distroless Python 3
Dërgimi i kontekstit të ndërtimit në daemonin Docker 2.048kB
Hapi 1/2: FROM gcr.io/distroless/python3
---> 556d570d5c53
Hapi 2/2: RUN pip3 install numpy
---> Po ekzekutohet në dbfe5623f125
/bin/sh: 1: pip3: nuk u gjetPip nuk është në imazh
Zakonisht, ky problem zgjidhet me ndihmën e ndërtimit në disa etapa:
FROM python:3 si ndërtues
RUN pip3 install numpy
FROM gcr.io/distroless/python3
COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.5/Ndërtimi në disa etapa
Si rezultat, kemi një imazh me madhësi 130MB. Nuk është aq keq! Për krahasim, imazhi standard i Python peshon 929MB, ndërsa ai "i dobësuar" (3.7-slim) peshon 179MB, imazhi alpine (3.7-alpine) peshon 98.6MB, ndërsa imazhi bazë distroless, i përdorur në shembull, peshojnë 50.9MB.
ĂshtĂ« e drejtĂ« tĂ« thuhet se nĂ« shembullin e mĂ«parshĂ«m ne kopjojmĂ« njĂ« katalog tĂ« tĂ«rĂ« /usr/local/lib/python3.7/site-packages, i cili mund tĂ« ketĂ« varĂ«si qĂ« nuk na nevojiten. MegjithatĂ«, Ă«shtĂ« e qartĂ« se ndryshimi nĂ« madhĂ«sinĂ« e tĂ« gjitha imazheve themelore tĂ« Python variaton.
Në momentin e shkrimit të këtyre rreshtave, Google distroless nuk mbështet shumë imazhe: Java dhe Python janë ende në fazën eksperimentale, ndërsa Python ekziston vetëm për 2.7 dhe 3.5.
Imazhe të vogla
Të kthehemi te obsesioni im për të krijuar imazhe të vogla.
NĂ« tĂ« vĂ«rtetĂ«, dĂ«shiroja tĂ« shihja sesi janĂ« tĂ« strukturuara imazhet distroless. Projekti distroless pĂ«rdor mjetin e ndĂ«rtimit tĂ« Google-it bazel. MegjithatĂ«, pĂ«r tĂ« instaluar Bazel dhe pĂ«r tĂ« shkruar imazhe tĂ« mia, mĂ« duhej tĂ« punoja (dhe nĂ«se tĂ« jem tĂ«rĂ«sisht i sinqertĂ«, tĂ« ripĂ«rfitoja qĂ«llimin â kjo Ă«shtĂ« e kĂ«ndshme dhe informuese). DĂ«shiroja tĂ« thjeshtoja krijimin e imazheve tĂ« reduktuara: akti i krijimit tĂ« njĂ« imazhi duhet tĂ« jetĂ« sa mĂ« i thjeshtĂ«, banal. QĂ« tĂ« mos ketĂ« asnjĂ« skedar konfigurimi, vetĂ«m njĂ« rresht nĂ« konsolĂ«: thjesht ndĂ«rto njĂ« imazh pĂ«r <aplikacionin>.
Pra, nĂ«se dĂ«shironi tĂ« krijoni imazhe tĂ« veta, duhet tĂ« dini: ekziston njĂ« imazh unik docker, scratch. Scratch Ă«shtĂ« njĂ« imazh "boshe", nĂ« tĂ« nuk ka skedarĂ«, madje pesha e tij fillestare Ă«shtĂ« â oho! â 77 byte.
FROM scratchImazhi scratch
Ideja e imazhit scratch është se mund të kopjoni çdo varësi nga makina amë dhe ose t'i përdorni ato brenda Dockerfile (siç është kopjimi i tyre në apt dhe të instaloni nga fillimi), ose më vonë, kur imazhi Docker është konkretizuar. Kjo lejon një kontroll të plotë mbi përmbajtjen e kontejnerit Docker dhe, kështu, mbi madhësinë e imazhit.
Tani na nevojitet ndonjë mënyrë për të mbledhur këto varësi. Mjetet ekzistuese si apt lejojnë të shkarkoni paketa, por ato janë të lidhura me makinën aktuale dhe, në fund të fundit, nuk mbështesin Windows ose MacOS.
Dhe kështu, unë fillova të krijoj mjetin tim, i cili do të ndërtonte automatikisht një imazh bazë me madhësinë më të vogël të mundshme dhe që do të mund të ekzekutonte çdo aplikacion. Përdora paketa Ubuntu/Debian, bëra seleksion (duke marrë paketat drejtpërdrejt nga repo) dhe gjeja varësitë e tyre në mënyrë recursive. Programi duhej të shkarkonte automatikisht versionin më të fundit të qëndrueshëm të paketës, duke minimizuar ndjeshëm rreziqet për sigurinë.
Mjeti e quajta fetchy, sepse ai⊠gjen dhe sjell⊠çfarĂ« nevojitet [nga anglishtja "fetch", "sjell" â shĂ«n. pĂ«r.]. Mjeti punon pĂ«rmes njĂ« ndĂ«rfaqeje tĂ« linjĂ«s sĂ« komandĂ«s, por nĂ« tĂ« njĂ«jtĂ«n kohĂ« ofron edhe API.
Për të ndërtuar imazhin duke përdorur fetchy (të marrim këtë herë imazhin Python), ju duhet thjesht të përdorni CLI në këtë mënyrë: fetchy dockerize python. Mund t'ju kërkohet sistemi operativ i destinacionit dhe emri kodues, pasi fetchy aktualisht përdor vetëm paketa nga Debian dhe Ubuntu.
Tani është koha për të zgjedhur se cilat varësi janë krejtësisht të padëshiruara (në kontekstin tonë) dhe t'i përjashtojmë ato. Për shembull, Python varet nga perl, ndonëse funksionon në mënyrë të përkryer pa instaluar Perl.
Rezultatet
Imazhi Python, i krijuar me komandën fetchy dockerize python3.5 ka një madhësi të vetme prej 35MB (jam i sigurt se në të ardhmen mund të lehtësohet edhe më shumë). Pra, nga imazhi distroless, arritëm të presim edhe 15MB.
Të gjitha imazhet e grumbulluara deri tani mund të shihen .
Projekti â .
NĂ«se ju mungojnĂ« funksionet, thjesht krijoni njĂ« pĂ«rgjigje â do tĂ« jem i lumtur tĂ« ndihmoj đ Madje, nĂ« kĂ«tĂ« moment po punoj mbi integrimin e menaxherĂ«ve tĂ« tjerĂ« tĂ« pakove nĂ« fetchy, nĂ« mĂ«nyrĂ« qĂ« nevoja pĂ«r ndĂ«rtime me disa etapa tĂ« zhduket.
Burimi: habr.com
