[viide Ameerika lastemuinasjutule "Väike mootor, mis võiks" – u. sõidurada]*
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
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
Projekt -
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