Imazhe të vogla Docker që besonin në vete*

[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.] *

Imazhe të vogla Docker që besonin në vete*

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

Projekti 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 numpy

Dockerfile, 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 gjet

Pip 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 scratch

Imazhi 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 këtu.

Projekti — kĂ«tu.

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

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster