Pisikesed Dockeri pildid, mis uskusid endasse*

[viide Ameerika lastemuinasjutule "Väike mootor, mis võiks" – u. sõidurada]*

Pisikesed Dockeri pildid, mis uskusid endasse*

Kuidas luua automaatselt oma vajadustele vastavaid pisikesi Dockeri pilte

Ebatavaline kinnisidee

Viimase paari kuu jooksul olen olnud kinnisideeks sellest, kui väike võib olla Dockeri pilt ja rakendus ikka töötab?

Saan aru, mõte on kummaline.

Enne üksikasjadesse ja tehnilistesse asjadesse laskumist tahaksin selgitada, miks see probleem mind nii väga häiris ja kuidas see teid puudutab.

Miks suurus loeb

Dockeri pildi sisu vähendades vähendame sellega haavatavuste loendit. Lisaks muudame pildid puhtamaks, kuna need sisaldavad ainult seda, mida on vaja rakenduste käitamiseks.

On veel üks väike eelis - pilte laaditakse alla veidi kiiremini, kuid minu arvates pole see nii oluline.

Pange tähele: kui olete suuruse pärast mures, on Alpine välimus ise väike ja sobib teile tõenäoliselt.

Distroless pildid

Projekt Distroless pakub valikut põhilisi "distroless" pilte, need ei sisalda paketihaldureid, kestasid ega muid utiliite, mida olete harjunud käsurealt nägema. Selle tulemusena kasutage paketihaldureid nagu pip и apt ei tööta:

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

Dockerfile, kasutades Python 3 distroless pilti

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

Pipi pole pildil

Tavaliselt lahendatakse see probleem mitmeastmelise ehitamisega:

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/

Mitmeastmeline kokkupanek

Tulemuseks on 130 MB suurune pilt. Mitte väga halb! Võrdluseks: Pythoni vaikepilt kaalub 929 MB ja “õhem” (3,7-slim) - 179 MB, alpi pilt (3,7-alpine) on 98,6 MB, samas kui näites kasutatav põhikujutis on 50,9 MB.

On õiglane märkida, et eelmises näites kopeerime tervet kataloogi /usr/local/lib/python3.7/site-packages, mis võib sisaldada sõltuvusi, mida me ei vaja. Kuigi on selge, et kõigi olemasolevate Pythoni baaspiltide suuruse erinevus on erinev.

Selle artikli kirjutamise ajal ei toeta Google distroless paljusid pilte: Java ja Python on alles katsefaasis ning Python on olemas ainult versioonide 2,7 ja 3,5 jaoks.

Pisikesed pildid

Tagasi minu kinnisidee juurde väikeste piltide loomisel.

Üldiselt tahtsin näha, kuidas distroless pilte konstrueeritakse. Distroless projekt kasutab Google'i ehitustööriista bazel. Bazeli installimine ja oma piltide kirjutamine võttis aga palju tööd (ja ausalt öeldes on ratta uuesti leiutamine lõbus ja hariv). Tahtsin väiksemate piltide loomist lihtsustada: pildi loomise toiming peaks olema äärmiselt lihtne, banaalne. Et teie jaoks poleks konfiguratsioonifaile, piisab konsoolis ühest reast: просто собрать образ для <приложение>.

Seega, kui soovite luua oma pilte, siis teadke: seal on selline ainulaadne dokkimispilt, scratch. Scratch on "tühi" pilt, selles pole faile, kuigi see kaalub vaikimisi - vau! - 77 baiti.

FROM scratch

Scratch pilt

Scratch-kujutise idee seisneb selles, et saate hostmasinast sellesse kopeerida kõik sõltuvused ja kasutada neid Docker-failis (see on nagu nende kopeerimine apt ja installige nullist) või hiljem, kui Dockeri kujutis realiseerub. See võimaldab teil täielikult kontrollida Dockeri konteineri sisu ja seega täielikult kontrollida pildi suurust.

Nüüd peame need sõltuvused kuidagi kokku koguma. Olemasolevad tööriistad nagu apt võimaldavad teil pakette alla laadida, kuid need on seotud praeguse masinaga ja lõppude lõpuks ei toeta Windowsi ega MacOS-i.

Seega otsustasin luua oma tööriista, mis looks automaatselt võimalikult väikese suurusega põhipildi ja käivitaks ka mis tahes rakenduse. Kasutasin Ubuntu/Debiani pakette, tegin valiku (sain paketid otse hoidlatest) ja leidsin rekursiivselt nende sõltuvused. Programm pidi automaatselt alla laadima paketi uusima stabiilse versiooni, minimeerides turvariske nii palju kui võimalik.

Panin tööriistale nime fetchy, sest ta... leiab ja toob... mida vaja [inglise keelest "tooma", "tooma" - u. sõidurada]. Tööriist töötab käsurea liidese kaudu, kuid pakub samal ajal API-d.

Pildi koostamiseks kasutades fetchy (võtame seekord Pythoni pildi), peate lihtsalt kasutama CLI-d järgmiselt: fetchy dockerize python. Teilt võidakse küsida sihtoperatsioonisüsteemi ja koodnime, kuna fetchy kasutab praegu ainult Debianil ja Ubuntul põhinevaid pakette.

Nüüd saate valida, millised sõltuvused pole üldse vajalikud (meie kontekstis) ja need välistada. Näiteks Python sõltub perlist, kuigi see töötab hästi ka ilma Perli installimata.

Järeldused

Pythoni pilt, mis on loodud käsuga fetchy dockerize python3.5 kaalub vaid 35MB (olen enam kui kindel, et tulevikus saab seda veelgi kergemaks teha). Selgub, et meil õnnestus distroless pildist veel 15 WW maha raseerida.

Näete kõiki seni kogutud pilte siin.

Projekt - siin.

Kui teil on funktsioone puudu, siis lihtsalt looge päring - aitan hea meelega :) Veelgi enam, ma tegelen praegu teiste paketihaldurite integreerimisega fetchysse, et poleks vaja mitmeastmelisi ehitusi.

Allikas: www.habr.com

Lisa kommentaar