Nelieli Docker attēli, kas ticēja paÅ”i sev*

[atsauce uz amerikāņu bērnu pasaku "The Little Engine That Could" - apm. josla]*

Nelieli Docker attēli, kas ticēja paÅ”i sev*

Kā automātiski izveidot nelielus Docker attēlus savām vajadzībām

Neparasta apsēstība

Pēdējos pāris mēneÅ”us esmu bijis apsēsts ar to, cik mazs var bÅ«t Docker attēls, un lietojumprogramma joprojām darbojas?

Saprotu, doma dīvaina.

Pirms Ä·eros pie detaļām un tehniskajiem aspektiem, es vēlos paskaidrot, kāpēc Ŕī problēma mani tik ļoti uztrauca un kā tā attiecas uz jums.

Kāpēc izmēram ir nozīme

Samazinot Docker attēla saturu, mēs tādējādi samazinām ievainojamÄ«bu sarakstu. Turklāt mēs padarām attēlus tÄ«rākus, jo tajos ir tikai tas, kas nepiecieÅ”ams lietojumprogrammu palaiÅ”anai.

Ir vēl viena neliela priekÅ”rocÄ«ba - attēli tiek lejupielādēti nedaudz ātrāk, bet, manuprāt, tas nav tik svarÄ«gi.

Lūdzu, ņemiet vērā: ja jūs uztrauc izmērs, Alpine izskatās mazs un, visticamāk, jums derēs.

Distroless attēli

Projekts Distroless piedāvā vienkārÅ”u ā€œdistrolessā€ attēlu izlasi, tajos nav pakotņu pārvaldnieku, čaulu un citu utilÄ«tu, ko esat pieradis redzēt komandrindā. Tā rezultātā izmantojiet pakeÅ”u pārvaldniekus, piemēram, pip Šø apt nedarbosies:

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

Dockerfile, izmantojot Python 3 distroless attēlu

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 nav attēlā

Parasti Ŕī problēma tiek atrisināta ar daudzpakāpju bÅ«vniecÄ«bu:

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/

Daudzpakāpju montāža

Rezultāts ir 130 MB liels attēls. Nav slikti! SalÄ«dzinājumam: noklusējuma Python attēls sver 929 MB, bet ā€œplānākaisā€ (3,7-slim) - 179 MB, kalnu attēls (3,7-alpine) ir 98,6 MB, savukārt piemērā izmantotais pamata bezdistrozes attēls ir 50,9 MB.

Ir godÄ«gi norādÄ«t, ka iepriekŔējā piemērā mēs kopējot visu direktoriju /usr/local/lib/python3.7/site-packages, kurā var bÅ«t mums nevajadzÄ«gas atkarÄ«bas. Lai gan ir skaidrs, ka visu esoÅ”o Python bāzes attēlu izmēru atŔķirÄ«ba ir atŔķirÄ«ga.

RakstÄ«Å”anas laikā Google distroless neatbalsta daudzus attēlus: Java un Python joprojām ir eksperimenta stadijā, un Python pastāv tikai versijām 2,7 un 3,5.

Sīki attēli

Atpakaļ pie manas apsēstÄ«bas ar mazu attēlu veidoÅ”anu.

Vispār es gribēju redzēt, kā tiek konstruēti bezdistroless attēli. Distroless projektā tiek izmantots Google veidoÅ”anas rÄ«ks bazel. Tomēr Bazel instalÄ“Å”ana un savu attēlu rakstÄ«Å”ana prasÄ«ja daudz darba (un, godÄ«gi sakot, riteņa izgudroÅ”ana ir jautra un izglÄ«tojoÅ”a). Es gribēju vienkārÅ”ot mazāku attēlu izveidi: attēla izveidei jābÅ«t ārkārtÄ«gi vienkārÅ”ai, banāls. Lai jums nebÅ«tu konfigurācijas failu, konsolē ir tikai viena rindiņa: ŠæрŠ¾ŃŃ‚Š¾ сŠ¾Š±Ń€Š°Ń‚ŃŒ Š¾Š±Ń€Š°Š· Š“Š»Ń <ŠæрŠøŠ»Š¾Š¶ŠµŠ½ŠøŠµ>.

Tātad, ja vēlaties izveidot savus attēlus, ziniet: ir tik unikāls doka attēls, scratch. Scratch ir ā€œtukÅ”sā€ attēls, tajā nav neviena faila, lai gan pēc noklusējuma tas sver - oho! - 77 baiti.

FROM scratch

Skrāpēts attēls

Skrāpēta attēla ideja ir tāda, ka jÅ«s varat tajā iekopēt visas atkarÄ«bas no resursdatora un vai nu izmantot tās Docker failā (tas ir kā kopÄ“Å”ana uz apt un instalējiet no nulles) vai vēlāk, kad tiek materializēts Docker attēls. Tas ļauj pilnÄ«bā kontrolēt Docker konteinera saturu un tādējādi pilnÄ«bā kontrolēt attēla izmēru.

Tagad mums ir kaut kā jāsavāc Ŕīs atkarÄ«bas. EsoÅ”ie rÄ«ki, piemēram apt ļauj lejupielādēt pakotnes, taču tās ir saistÄ«tas ar paÅ”reizējo maŔīnu un galu galā neatbalsta Windows vai MacOS.

Tāpēc es nolēmu izveidot savu rÄ«ku, kas automātiski izveidotu pēc iespējas mazāka izmēra pamata attēlu un arÄ« palaistu jebkuru lietojumprogrammu. Es izmantoju Ubuntu/Debian pakotnes, veicu atlasi (pakeÅ”u iegÅ«Å”ana tieÅ”i no krātuvēm) un rekursÄ«vi atradu to atkarÄ«bas. Programmai bija paredzēts automātiski lejupielādēt jaunāko stabilo pakotnes versiju, pēc iespējas samazinot droŔības riskus.

Es nosaucu rÄ«ku fetchy, jo viņŔ... atrod un atnes... ko vajag [no angļu valodas ā€œatnestā€, ā€œatnestā€ - apm. josla]. RÄ«ks darbojas, izmantojot komandrindas saskarni, bet tajā paŔā laikā piedāvā API.

Lai saliktu attēlu, izmantojot fetchy (Å”oreiz ņemsim Python attēlu), jums vienkārÅ”i jāizmanto CLI Ŕādi: fetchy dockerize python. Jums var tikt lÅ«gts norādÄ«t mērÄ·a operētājsistēmu un koda nosaukumu, jo fetchy paÅ”laik izmanto tikai paketes, kuru pamatā ir Debian un Ubuntu.

Tagad jūs varat izvēlēties, kuras atkarības vispār nav vajadzīgas (mūsu kontekstā), un tās izslēgt. Piemēram, Python ir atkarīgs no perl, lai gan tas darbojas labi, ja Perl nav instalēts.

rezultātus

Python attēls, kas izveidots, izmantojot komandu fetchy dockerize python3.5 sver tikai 35MB (esmu vairāk nekā pārliecināts, ka nākotnē to varēs padarīt vēl vieglāku). Izrādās, ka mums izdevās noskuj vēl 15 WW no distroless attēla.

JÅ«s varat redzēt visus lÄ«dz Å”im savāktos attēlus Å”eit.

Projekts - Ŕeit.

Ja jums trÅ«kst funkciju, vienkārÅ”i izveidojiet pieprasÄ«jumu - es ar prieku palÄ«dzÄ“Å”u :) Vēl vairāk, es Å”obrÄ«d strādāju pie citu pakotņu pārvaldnieku integrÄ“Å”anas fetchy, lai nebÅ«tu vajadzÄ«bas pēc vairākpakāpju bÅ«vÄ“Å”anas.

Avots: www.habr.com

Pievieno komentāru