Imazhet e Tiny Docker që besonin në vetvete*

[referencë për përrallën amerikane për fëmijë "Motori i vogël që mundi" - përafërsisht. korsi]*

Imazhet e Tiny Docker që besonin në vetvete*

Si të krijoni automatikisht imazhe të vogla Docker për nevojat tuaja

Obsesion i pazakontë

Për dy muajt e fundit, unë kam qenë i fiksuar me atë se sa i vogël mund të jetë një imazh Docker dhe që aplikacioni ende të funksionojë?

E kuptoj, ideja është e çuditshme.

Para se të hyj në detajet dhe teknikat, do të doja të shpjegoja pse më shqetësoi kaq shumë ky problem dhe si ju shqetëson.

Pse madhësia ka rëndësi

Duke zvogëluar përmbajtjen e imazhit të Docker, ne zvogëlojmë listën e dobësive. Për më tepër, ne i bëjmë imazhet më të pastra, sepse ato përmbajnë vetëm atë që nevojitet për të ekzekutuar aplikacionet.

Ekziston edhe një avantazh i vogël - imazhet shkarkohen pak më shpejt, por, për mendimin tim, kjo nuk është aq e rëndësishme.

Ju lutemi vini re: Nëse jeni të shqetësuar për madhësinë, vetë pamja Alpine është e vogël dhe ka të ngjarë t'ju përshtatet.

Imazhe pa shpërndarje

Projekti Distroless ofron një përzgjedhje të imazheve bazë "pa shpërndarje", ato nuk përmbajnë menaxherë paketash, predha dhe shërbime të tjera që jeni mësuar t'i shihni në vijën e komandës. Si rezultat, përdorni menaxherët e paketave si pip и apt nuk punon:

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

Dockerfile duke përdorur imazhin e Python 3 pa shpërndarë

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 nuk është në imazh

Zakonisht ky problem zgjidhet nga një ndërtim me shumë faza:

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/

Montimi me shumë faza

Rezultati është një imazh me madhësi 130 MB. Jo shume keq! Për krahasim: imazhi i parazgjedhur i Python peshon 929 MB, dhe ai "më i hollë" (3,7-slim) - 179 MB, imazh alpin (3,7-alpine) është 98,6 MB, ndërsa imazhi bazë pa shpërndarje i përdorur në shembull është 50,9 MB.

Është e drejtë të theksohet se në shembullin e mëparshëm ne po kopjojmë një drejtori të tërë /usr/local/lib/python3.7/site-packages, e cila mund të përmbajë varësi që nuk na duhen. Edhe pse është e qartë se ndryshimi i madhësisë së të gjitha imazheve ekzistuese bazë Python ndryshon.

Në kohën e shkrimit, Google distroless nuk mbështet shumë imazhe: Java dhe Python janë ende në fazën eksperimentale, dhe Python ekziston vetëm për 2,7 dhe 3,5.

Imazhe të vogla

Kthehu tek fiksimi im për krijimin e imazheve të vogla.

Në përgjithësi, doja të shihja se si ndërtohen imazhet pa shpërndarje. Projekti pa shpërndarë përdor mjetin e ndërtimit të Google bazel. Sidoqoftë, instalimi i Bazel dhe shkrimi i imazheve tuaja kërkon shumë punë (dhe për të qenë plotësisht i sinqertë, rishpikja e timonit është argëtuese dhe edukative). Doja të thjeshtoja krijimin e imazheve më të vogla: akti i krijimit të një imazhi duhet të jetë jashtëzakonisht i thjeshtë, banale. Kështu që nuk ka skedarë konfigurimi për ju, vetëm një rresht në tastierë: просто собрать образ для <приложение>.

Pra, nëse doni të krijoni imazhet tuaja, atëherë dijeni: ekziston një imazh kaq unik docker, scratch. Scratch është një imazh "bosh", nuk ka skedarë në të, megjithëse peshon si parazgjedhje - wow! - 77 bajt.

FROM scratch

Gërvishtje imazhi

Ideja e një imazhi gërvishtjeje është që ju mund të kopjoni çdo varësi nga makina pritës në të dhe ose t'i përdorni ato brenda një skedari Docker (kjo është si t'i kopjoni ato në apt dhe instaloni nga e para), ose më vonë kur imazhi i Docker materializohet. Kjo ju lejon të kontrolloni plotësisht përmbajtjen e kontejnerit Docker, dhe kështu të kontrolloni plotësisht madhësinë e imazhit.

Tani duhet t'i mbledhim disi këto varësi. Mjetet ekzistuese si apt ju lejojnë të shkarkoni paketa, por ato janë të lidhura me makinën aktuale dhe, në fund të fundit, nuk mbështesin Windows ose MacOS.

Kështu që nisa të ndërtoj mjetin tim që do të ndërtonte automatikisht një imazh bazë të madhësisë më të vogël të mundshme dhe gjithashtu do të ekzekutonte çdo aplikacion. Kam përdorur paketat Ubuntu/Debian, kam bërë një përzgjedhje (duke marrë paketa direkt nga depot) dhe kam gjetur në mënyrë rekursive varësitë e tyre. Programi duhej të shkarkonte automatikisht versionin më të fundit të qëndrueshëm të paketës, duke minimizuar sa më shumë rreziqet e sigurisë.

I vura emrin mjetit fetchy, sepse ai... gjen dhe sjell... atë që duhet [nga anglishtja "marr", "sjell" - përafërsisht. korsi]. Mjeti funksionon përmes një ndërfaqe të linjës së komandës, por në të njëjtën kohë ofron një API.

Për të mbledhur një imazh duke përdorur fetchy (le të marrim një imazh Python këtë herë), ju vetëm duhet të përdorni CLI si kjo: fetchy dockerize python. Mund t'ju kërkohet sistemi operativ i synuar dhe emri i koduar sepse fetchy aktualisht përdor vetëm paketa të bazuara në Debian dhe Ubuntu.

Tani mund të zgjidhni cilat varësi nuk nevojiten fare (në kontekstin tonë) dhe t'i përjashtoni ato. Për shembull, Python varet nga perl, megjithëse funksionon mirë pa instaluar Perl.

Gjetjet

Imazhi i Python i krijuar duke përdorur 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ë). Rezulton se ne arritëm të rruanim edhe 15 WW të tjera nga imazhi pa shpërndarë.

Ju mund të shihni të gjitha imazhet e mbledhura deri më tani këtu.

Projekt - këtu.

Nëse ju mungojnë veçoritë, thjesht krijoni një kërkesë - do të jem i lumtur t'ju ndihmoj :) Për më tepër, aktualisht jam duke punuar në integrimin e menaxherëve të tjerë të paketave në fetchy, në mënyrë që të mos ketë nevojë për ndërtime me shumë faza.

Burimi: www.habr.com

Shto një koment