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 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 š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

Iegādājieties uzticamu mitināšanu vietnēm ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa vietņu mitināšanu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster