Örsmáar Docker myndir sem trúðu á sjálfar sig*

[vísun í bandaríska barnaævintýrið "The Little Engine That Could" - u.þ.b. braut]*

Örsmáar Docker myndir sem trúðu á sjálfar sig*

Hvernig á að búa til sjálfkrafa litlar Docker myndir fyrir þarfir þínar

Óvenjuleg þráhyggja

Undanfarna mánuði hef ég verið heltekinn af því hversu lítil Docker mynd getur verið og hefur forritið ennþá í gangi?

Ég skil, hugmyndin er undarleg.

Áður en ég fer út í smáatriðin og tækniatriðin, langar mig að útskýra hvers vegna þetta vandamál truflaði mig svona mikið og hvernig það snertir þig.

Hvers vegna stærð skiptir máli

Með því að draga úr innihaldi Docker myndarinnar minnkum við þar með listann yfir varnarleysi. Að auki gerum við myndirnar hreinni vegna þess að þær innihalda aðeins það sem þarf til að keyra forrit.

Það er einn lítill kostur í viðbót - myndum er hlaðið niður aðeins hraðar, en að mínu mati er þetta ekki svo mikilvægt.

Vinsamlega athugið: Ef þú hefur áhyggjur af stærðinni er Alpine útlitið sjálft lítið og mun líklega passa þig.

Óeðlilegar myndir

Verkefni Distroless býður upp á úrval af grunn „dreifingarlausum“ myndum, þær innihalda ekki pakkastjóra, skeljar og önnur tól sem þú ert vanur að sjá á skipanalínunni. Þess vegna skaltu nota pakkastjóra eins og pip и apt mun ekki virka:

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

Dockerfile með Python 3 distroless mynd

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 er ekki á myndinni

Venjulega er þetta vandamál leyst með fjölþrepa byggingu:

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/

Fjölþrepa samsetning

Útkoman er mynd sem er 130MB að stærð. Ekki svo slæmt! Til samanburðar: sjálfgefna Python myndin vegur 929MB og sú „þynnri“ (3,7-slim) - 179MB, alpamynd (3,7-alpine) er 98,6MB, en grunnmyndin sem notuð er í dæminu er 50,9MB.

Það er rétt að benda á að í fyrra dæminu erum við að afrita heila möppu /usr/local/lib/python3.7/site-packages, sem gæti innihaldið ósjálfstæði sem við þurfum ekki. Þó það sé ljóst að stærðarmunur allra núverandi Python grunnmynda er mismunandi.

Þegar þetta er skrifað styður Google distroless ekki margar myndir: Java og Python eru enn á tilraunastigi og Python er aðeins til fyrir 2,7 og 3,5.

Litlar myndir

Aftur að þráhyggju minni um að búa til litlar myndir.

Almennt langaði mig að sjá hvernig distroless myndir eru smíðaðar. The distroless verkefni notar Google smíða tól bazel. Hins vegar kostaði mikla vinnu að setja upp Bazel og skrifa þínar eigin myndir (og satt að segja er það skemmtilegt og fræðandi að finna upp hjólið aftur). Mig langaði til að einfalda sköpun smærri mynda: aðgerðin við að búa til mynd ætti að vera mjög einföld, banal. Svo að það eru engar stillingarskrár fyrir þig, bara ein lína í stjórnborðinu: просто собрать образ для <приложение>.

Svo, ef þú vilt búa til þínar eigin myndir, þá veistu: það er til svo einstök bryggjumynd, scratch. Scratch er „tóm“ mynd, það eru engar skrár í henni, þó hún vegi sjálfgefið - vá! - 77 bæti.

FROM scratch

Klóra mynd

Hugmyndin um rispumynd er að þú getur afritað hvaða ósjálfstæði sem er frá hýsingarvélinni inn í hana og annað hvort notað þær í Dockerfile (þetta er eins og að afrita þær í apt og settu upp frá grunni), eða síðar þegar Docker myndin er að veruleika. Þetta gerir þér kleift að stjórna innihaldi Docker ílátsins algjörlega og stjórna þannig stærð myndarinnar algjörlega.

Nú þurfum við einhvern veginn að safna þessum ósjálfstæði. Núverandi verkfæri eins og apt leyfa þér að hlaða niður pakka, en þeir eru bundnir við núverandi vél og styðja, þegar allt kemur til alls, ekki Windows eða MacOS.

Svo ég ákvað að smíða mitt eigið tól sem myndi sjálfkrafa byggja grunnmynd af minnstu mögulegu stærð og keyra líka hvaða forrit sem er. Ég notaði Ubuntu/Debian pakka, gerði val (fá pakka beint úr geymslunum) og fann afturkvæmt ósjálfstæði þeirra. Forritið átti að hlaða niður nýjustu stöðugu útgáfunni af pakkanum sjálfkrafa og lágmarka öryggisáhættu eins mikið og mögulegt er.

Ég nefndi tólið fetchy, því hann... finnur og kemur með... það sem þarf [úr ensku "sækja", "koma með" - ca. braut]. Tólið vinnur í gegnum skipanalínuviðmót en býður á sama tíma upp á API.

Til að setja saman mynd með því að nota fetchy (tökum Python mynd að þessu sinni), þú þarft bara að nota CLI svona: fetchy dockerize python. Þú gætir verið beðinn um markstýrikerfið og kóðanafn vegna þess fetchy sem stendur notar eingöngu pakka sem byggja á Debian og Ubuntu.

Nú geturðu valið hvaða ósjálfstæði er alls ekki þörf (í okkar samhengi) og útilokað þær. Til dæmis er Python háð perl, þó það virki fínt án þess að Perl sé uppsett.

Niðurstöður

Python mynd búin til með skipuninni fetchy dockerize python3.5 vegur aðeins 35MB (ég er meira en viss um að í framtíðinni sé hægt að gera það enn léttara). Það kemur í ljós að við náðum að raka af okkur 15 WW í viðbót frá óeðlilegu myndinni.

Þú getur séð allar myndirnar sem safnað hefur verið hingað til hér.

Verkefni - hér.

Ef þig vantar eiginleika skaltu bara búa til beiðni - ég mun vera fús til að hjálpa :) Jafnvel meira, ég er núna að vinna að því að samþætta aðra pakkastjóra í fetchy, svo að það er engin þörf á fjölþrepa byggingu.

Heimild: www.habr.com

Bæta við athugasemd