Bere buruan sinesten zuten Docker irudi txikiak*

["The Little Engine That Could" haurrentzako ipuin amerikarraren erreferentzia - gutxi gorabehera. erreia]*

Bere buruan sinesten zuten Docker irudi txikiak*

Nola sortu automatikoki Docker irudi txikiak zure beharretarako

Ezohiko Obsesioa

Azken hilabeteetan, Docker irudi bat zein txikia izan daitekeen obsesionatuta egon naiz eta oraindik aplikazioa martxan daukat?

Ulertzen dut, ideia arraroa da.

Xehetasunetan eta teknifikazioetan sartu baino lehen, arazo honek zergatik kezkatu ninduen hainbeste, eta zuri nolakoa den azaldu nahiko nuke.

Zergatik garrantzia du tamainak

Docker irudiaren edukia murriztuz, ahultasunen zerrenda murrizten dugu. Gainera, irudiak garbiagoak egiten ditugu, aplikazioak exekutatzeko beharrezkoa dena baino ez baitute.

Beste abantaila txiki bat dago: irudiak apur bat azkarrago deskargatzen dira, baina, nire ustez, hori ez da hain garrantzitsua.

Kontuan izan: tamainaz kezkatzen bazaizu, itxura alpinoa txikia da eta ziurrenik egokituko zaizu.

Distroless irudiak

Distroless proiektua "Distroless" oinarrizko irudien aukeraketa bat eskaintzen du, ez dute pakete-kudeatzailerik, shell-ek eta komando-lerroan ikusten ohi dituzun bestelako utilitaterik. Ondorioz, erabili pakete kudeatzaileak bezalakoak pip ΠΈ apt ez du funtzionatuko:

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

Dockerfile Python 3 distroless irudia erabiliz

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 ez dago irudian

Normalean, arazo hau etapa anitzeko eraikuntza baten bidez konpontzen da:

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/

Etapa anitzeko muntaia

Emaitza 130MB-ko irudia da. Ez hain txarra! Konparazio baterako: Python-en irudi lehenetsiak 929 MB pisatzen ditu eta "meheagoak" (3,7-slim) - 179 MB, irudi alpinoa (3,7-alpine) 98,6 MB da, eta adibidean erabilitako oinarrizko distroless irudia 50,9 MB da.

Bidezkoa da azpimarratzea aurreko adibidean direktorio oso bat kopiatzen ari garela /usr/local/lib/python3.7/site-packages, behar ez ditugun mendekotasunak izan ditzake. Argi dagoen arren, dauden Python oinarrizko irudi guztien tamaina desberdintasuna aldatu egiten dela.

Idazteko momentuan, Google-k distroless-ek ez ditu irudi asko onartzen: Java eta Python-ek fase esperimentalean daude oraindik, eta Python 2,7 eta 3,5-etarako bakarrik dago.

Irudi txikiak

Itzuli irudi txikiak sortzeko nire obsesiora.

Oro har, distroless irudiak nola eraikitzen diren ikusi nahi nuen. Distroless proiektuak Google-ren eraikuntza tresna erabiltzen du bazel. Hala ere, Bazel instalatzeak eta zure irudiak idazteak lan handia egin zuen (eta egia esateko, gurpila berrasmatzea dibertigarria eta hezigarria da). Irudi txikiagoak sortzea erraztu nahi nuen: irudi bat sortzeko ekintza oso erraza izan behar da, hutsala. Zuretzako konfigurazio fitxategirik ez egon dadin, kontsolan lerro bakarra: просто ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π· для <ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅>.

Beraz, zure irudiak sortu nahi badituzu, jakin ezazu: bada docker irudi paregabea, scratch. Scratch "hutsik" irudi bat da, ez dago fitxategirik, nahiz eta berez pisatzen duen - wow! - 77 byte.

FROM scratch

Scratch irudia

Scratch irudi baten ideia da makina ostalaritik edozein mendekotasun kopiatu dezakezula eta Dockerfile baten barruan erabil ditzakezula (hau da apt eta hutsetik instalatu), edo geroago Dockerren irudia gauzatzen denean. Horri esker, Docker edukiontziaren edukia guztiz kontrola dezakezu, eta, horrela, irudiaren tamaina guztiz kontrola dezakezu.

Orain menpekotasun horiek nolabait bildu behar ditugu. Dauden tresnak bezalakoak apt paketeak deskargatzeko aukera ematen dizu, baina uneko makinari lotuta daude eta, azken finean, ez dute Windows edo MacOS onartzen.

Beraz, nire tresna propioa eraikitzeari ekin nion, ahalik eta tamaina txikieneko oinarrizko irudi bat automatikoki eraikiko zuena eta edozein aplikazio ere exekutatzeko. Ubuntu/Debian paketeak erabili, aukeraketa bat egin nuen (paketeak biltegietatik zuzenean eskuratzen) eta errekurtsiboki haien mendekotasunak aurkitu nituen. Programak paketearen azken bertsio egonkorra automatikoki deskargatu behar zuen, segurtasun arriskuak ahalik eta gehien murriztuz.

Erremintari izena jarri diot fetchy, berak... aurkitzen eta ekartzen duelako... behar dena [ingelesetik "eskuratu", "ekarri" - gutxi gorabehera. erreia]. Tresnak komando lerroko interfaze baten bidez funtzionatzen du, baina aldi berean API bat eskaintzen du.

Irudi bat muntatzeko erabiliz fetchy (har dezagun oraingoan Python irudi bat), CLI-a honela erabili behar duzu: fetchy dockerize python. Baliteke helburuko sistema eragilea eta kode-izena eskatuko zaizulako fetchy Une honetan Debian eta Ubuntun oinarritutako paketeak soilik erabiltzen ditu.

Orain batere behar ez diren menpekotasunak aukeratu ditzakezu (gure testuinguruan) eta baztertu. Adibidez, Python perl-en araberakoa da, nahiz eta ondo funtzionatzen duen Perl instalatu gabe.

Findings

Komandoa erabiliz sortutako Python irudia fetchy dockerize python3.5 35MB baino ez ditu pisatzen (ziur baino gehiago nago etorkizunean are arinago egin daitekeela). Ematen du distroless iruditik beste 15 WW kentzea lortu genuela.

Orain arte bildutako irudi guztiak ikus ditzakezu Hemen.

Proiektua - Hemen.

Ezaugarririk falta bazaizu, sortu eskaera - pozik lagunduko dizut :) Are gehiago, beste pakete-kudeatzaileak fetchy-n integratzeko lanean nabil, etapa anitzeko eraikuntzaren beharrik ez izateko.

Iturria: www.habr.com

Gehitu iruzkin berria