[referencë për përrallën amerikane për fëmijë “Lokomotiva e vogël që besonte në vete” (“The Little Engine That Could”) — shën. përk.] *

Si të krijoni automatikisht imazhe të vogla Docker për nevojat tuaja
Një obsesion i pazakontë
Dy muajt e fundit kam qenë i obsesionuar pas një ideje ngulmuese: sa shumë mund të reduktohet një imazh Docker në mënyrë që aplikacioni të funksionojë?
E kuptoj, ideja është e çuditshme.
Para se të thellohem në detaje dhe në teknologjinë përkatëse, do doja të sqaroj pse kjo çështje më preku aq shumë dhe si lidhet me ju.
Pse ka rëndësi madhësia
Duke reduktuar përmbajtjen e imazhit Docker, po ashtu zvogëlojmë listën e dobësive. Madje, ne e bëjmë imazhin më të pastër, sepse ata përmbajnë vetëm atë që është e nevojshme për të ekzekutuar aplikacionet.
Ka një avantazh të vogël tjetër — imazhet shkarkohen pak më shpejt, por siç mendoj unë, kjo nuk është aq e rëndësishme.
Vini re: Nëse jeni të shqetësuar për madhësinë, imazhet Alpine janë natyrisht të vogla dhe me siguri do t'ju përshtaten.
Imazhet Distroless
ofron një përzgjedhje të imazheve bazike «distroless», të cilat nuk përmbajnë menaxherë paketash, shell-e dhe utilitare të tjera që jeni mësuar të shihni në komandën e linjës. Si rezultat, nuk do të ndiheni në gjendje të përdorni menaxherë paketash siç është pip dhe apt nuk do të jetë e mundur:
FROM gcr.io/distroless/python3
RUN pip3 install numpyDockerfile, që përdor imazhin distroless të Python 3
Dërgimi i kontekstit të ndërtimit në demonin Docker 2.048kB
Hapi 1/2 : FROM gcr.io/distroless/python3
---> 556d570d5c53
Hapi 2/2 : RUN pip3 install numpy
---> Po punon në dbfe5623f125
/bin/sh: 1: pip3: nuk u gjetPip nuk është në imazh
Zakonisht, ky problem zgjidhet përmes ndërtimit të shumëfazshëm:
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 i shumëfazshëm
Si rezultat, merrni një imazh me një madhësi prej 130MB. Nuk është aq keq! Për krahasim: imazhi i Python ndërkombëtar peshon 929MB, ndërsa ai 'i dobësuar' (3.7-slim) — 179MB, imazhi alpine (3.7-alpine) — 98.6MB, kurse imazhi bazik distroless që u përdor në shembull është 50.9MB.
Mund të bëhet një argument i drejtë se në shembullin e mëparshëm po kopjojmë një katalog të tërë /usr/local/lib/python3.7/site-packages, në të cilin mund të qëndrojnë varësitë që nuk na nevojiten. Megjithatë, është e qartë se ndryshimi në madhësitë e të gjithë imazheve bazike të Python ndryshon.
Në momentin kur janë shkruar këto rreshta, Google distroless nuk mbështet shumë imazhe: Java dhe Python janë ende në fazë eksperimentale, dhe Python ekziston vetëm për versionet 2.7 dhe 3.5.
Imazhe të vogla
Le të kthehemi tek obsesioni im për të krijuar imazhe të vogla.
Në të vërtetë, doja të shihja se si janë ndërtuar imazhet distroless. Projekti distroless përdor mjetin e ndërtimit të Google-it bazel. Megjithatë, për të vendosur Bazel dhe për të shkruar imazhe të mia, duhej të punoja shumë (dhe, për të qenë krejtësisht i sinqertë, të shpikja rrotën nga e para — kjo është argëtuese dhe edukative). Dëshiroja të thjeshtësoja krijimin e imazheve të zvogëluara: akti i krijimit të një imazhi duhet të jetë ekstremisht i thjeshtë, banale. Pa ndonjë skedar konfigurimi, vetëm një rresht në konsolë: thjesht krijoni një imazh për.
Pra, nëse doni të krijoni imazhe të tua, vini re: ekziston një imazh unik docker, scratch. Scratch është një imazh "i zbrazët", nuk ka skedarë, megjithatë ai peshon nga default - oh! - 77 byte.
FROM scratchImazhi scratch
Ideja e imazhit scratch është që mund të kopjoni çdo varësi nga makina pritëse dhe ose t'i përdorni ato brenda Dockerfile (është si të kopjoni ato në apt dhe ta instaloje nga zero), ose më vonë, kur imazhi Docker materializohet. Kjo lejon kontroll të plotë mbi përmbajtjen e kontejnerit Docker, dhe, në këtë mënyrë, kontroll të plotë mbi madhësinë e imazhit.
Tani duhet ndonjë mënyrë për të mbledhur këto varësitë. Mjetet ekzistuese si apt lejojnë shkarkimin e pakove, por ato janë të lidhura me makinën aktuale dhe, përfundimisht, nuk mbështesin Windows ose MacOS.
Kështu fillova të krijoj një mjete të vetën, e cila do të mblidhte automatikisht një imazh bazë me madhësinë më të vogël të mundshme dhe që do të mund të ekzekutonte çdo aplikacion. Përdora pakot Ubuntu/Debian, duke bërë seleksion (duke marrë paketat direkt nga repositorët) dhe duke gjetur varësitë e tyre në mënyrë rekurzive. Programi duhej të shkarkonte automatikisht versionin e fundit stabil të paketës, duke minimizuar rreziqet për sigurinë.
Mjeti e quajta fetchy, sepse ai… gjen dhe sjell… atë që nevojitet [nga anglishtja «fetch», «të sjellësh» — shënim i përkthimit.] . Mjeti funksionon përmes një ndërfaqe të komandës, por njëkohësisht ofron dhe API.
Për të mbledhur imazhin me ndihmën e fetchy (të bëjmë këtë herë imazhin Python), thjesht duhet të përdorni CLI kështu: fetchy dockerize python. Mund të kërkohet sistemi operativ dhe emri i kodit që dëshironi, pasi fetchy për momentin përdor vetëm paketa bazuar në Debian dhe Ubuntu.
Tani mund të zgjidhni cilat varësi nuk janë të nevojshme (në kontekstin tonë) dhe t'i përjashtoni ato. Për shembull, Python varet nga perl, megjithatë punon për mrekulli pa pasur Perl të instaluar.
Rezultatet
Imazhi Python, i krijuar me komandën fetchy dockerize python3.5 peshon vetëm 35MB (jam mëse i sigurt se në të ardhmen mund të bëhet edhe më i lehtë). Pra, nga imazhi distroless, arritëm të "heqim" edhe 15MB.
Të gjithë imazhet e ndërtuara deri më tani mund të shihen .
Projekti — .
Nëse ju nevojiten më shumë funksionalitete, thjesht krijoni një ticket — do të isha i lumtur t'ju ndihmoj 🙂 Madje, unë aktualisht po punoj mbi integrimin e menaxherëve të tjerë të paketave në fetchy, në mënyrë që nevoja për ndërtime shumëfazore të largojë.
Burimi: habr.com
