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

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
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 piesaistītas pašreizējai mašīnai 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 bāzes attēlu un liktu tam palaist jebkuru lietojumprogrammu. Es izmantoju pakotnes. Ubuntu/Debian, veica atlasi (iegūstot pakotnes tieši no krātuvēm) un rekursīvi atrada to atkarības. Programmai bija automātiski jālejupielādē jaunākā stabilā pakotnes versija, tādējādi 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 pakotnes, kuru pamatā ir Debian и 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 .
Projekts - .
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
