Pisikesed Docker-i pildid, mis uskusid endasse*

[отсылка к американской детской сказке «Маленький паровозик, который верил в себя » («The Little Engine That Could») — прим. пер.]

Pisikesed Docker-i pildid, mis uskusid endasse*

Kuidas automaatselt luua väikeseid docker-image'e oma vajaduste jaoks

Ebatavaline kinnisidee

Viimased paar kuud olen olnud pidevalt teinud endale selgeks: kui väikeseks on võimalik Docker'i image'i vähendada, et rakendus ikkagi töötaks?

Mõistan, et idee on kummaline.

Enne kui süvenen detailidesse ja tehnilistesse küsimustesse, tahaksin selgitada, miks see probleem mind nii palju köitis ja kuidas see puudutab teid.

Miks suurus on tähtis

Docker'i image'i sisu vähendades vähendame ka haavatavuste nimekirja. Lisaks teeme image'id puhtamaks, kuna need sisaldavad ainult seda, mis on rakenduste käitamiseks vajalik.

On ka veel üks väike eelis — image'id alluvad natuke kiiremini, kuid minu arvates pole see nii oluline.

Pange tähele: kui teid huvitab suurus, on Alpine image'id ise juba väikesed ja tõenäoliselt sobivad teile.

Distroless-image'id

Distroless projekt pakub valikut põhjalikke „distroless” pilte, mis ei sisalda pakihaldureid, shell'e ega muid utiliite, millega olete harjunud käsureal. Seetõttu ei saa kasutada selliseid pakihaldureid nagu pip ja apt väga lihtsalt:

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

Dockerfile, mis kasutab distroless-pilti Python 3

Saadan build konteksti Docker daemon'ile 2.048kB
Samm 1/2: FROM gcr.io/distroless/python3
 ---> 556d570d5c53
Samm 2/2: RUN pip3 install numpy
 ---> Käib dbfe5623f125
/bin/sh: 1: pip3: ei leitud

Pipi pole pildis

Tavaliselt lahendatakse selline probleem mitmekihilise kokkupanemisega:

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/

Mitmekihiline kokkupanek

Tulemusena saadakse pilt, mille suurus on 130MB. Pole just halb! Võrdluseks: vaikimisi Python pilt kaalub 929MB, samas kui „kergem” (3,7-slim) — 179MB, alpine pilt (3,7-alpine) — 98,6MB, samas kui näites kasutatud põhjalik distroless-pilt on 50,9MB.

On õigustatud märkida, et eelnevas näites kopeerime terve katalooge /usr/local/lib/python3.7/site-packages, kus võivad asuda meie jaoks tarbetud sõltuvused. Kuigi on selge, et olemasolevate Python põhjalike piltide suuruste erinevus kõikuv.

Käesoleva teksti kirjutamise hetkel toetab Google distroless ainult väheseid pilte: Java ja Python on veel katsetamisjärgus, ning Python on saadaval vaid versioonides 2.7 ja 3.5.

Tüütud pildid

Tagasi minu kinnisidee juurde väikeste piltide loomisega.

Peamiselt tahtsin vaadata, kuidas distroless-pildid välja näevad. Distroless projekt kasutab Google'i koostamisvahendit bazel. Siiski, et Bazel installida ja oma pilte kirjutada, tuli kõvasti vaeva näha (kui olla täpselt aus, siis tuli ratast uuesti leiutada – see on lõbus ja õpetlik). Soovisin lihtsustada vähendatud piltide loomist: pildi loomise tegevus peaks olema äärmiselt lihtne, elementaarne. Et ei oleks mingeid konfiguratsioonifaile, vaid ainult üks rida konsoolis: lihtsalt looge pilt.

Nii et kui soovite luua oma pilte, siis teadke, et on olemas ainulaadne docker pilt, scratch. Scratch on "tühi" pilt, selles pole faile, kuigi see kaalub vaikimisi — oh wow! — 77 baiti.

FROM scratch

Scratch pilt

Scratch pildi idee seisneb selles, et saate kopeerida sinna mingeid sõltuvusi hostmasinast ja kas kasutada neid Dockerfile'is (see on nagu nende kopeerimine apt ja ja oma Docker-i pilti nullist või hiljem, kui Docker-i pilt on materialiseeritud. See annab täieliku kontrolli Docker-i konteinerite sisu üle ning seega ka pildi suuruse üle.

Nüüd peame kuidagi need sõltuvused kokku koguma. Olemasolevad tööriistad, nagu apt pakuvad pakettide allalaadimist, kuid need on seotud praeguse masinaga ja lõpuks ei toeta Windowsi ega MacOS-i.

Nii hakkasin looma oma tööriista, mis automaatselt koguks minimaalset võimalikku suurust baaspilti ja et see käitaks igasuguseid rakendusi. Kasutasin Ubuntu / Debian pakette, tõin üles (saades pakette otse hoidlatest) ja leidisin rekursiivselt nende sõltuvused. Programm pidi automaatselt alla laadima uusima stabiilse versiooni pakettidest, et maksimaalselt vähendada turvariske.

Tööriista nimetasin fetchy, kuna see… leiab ja toob… vajalikku [inglise „fetch”, „tuua” — tõlkija märk.]. Tööriist töötab käsurealiidese kaudu, kuid samas pakub ka API-d.

Et luua pilti, kasutades fetchy (võtame seekord Pythoni pildi), peate lihtsalt kasutama CLI-d järgmiselt: fetchy dockerize python. Teilt võib küsida sihtoperatsioonisüsteemi ja koodinime, kuna fetchy praegu kasutatakse ainult Debianil ja Ubuntu põhinevaid pakette.

Nüüd on võimalik valida, millised sõltuvused on täiesti tarbetud (meie kontekstis) ja need välja jätta. Näiteks sõltub Python Perl-ist, kuigi töötab suurepäraselt ilma Perlita.

Tulemused

Pythoni pilt, mis on loodud käsu abil fetchy dockerize python3.5 kaalub ainult 35 MB (olen täiesti kindel, et tulevikus saab seda veelgi kergemaks teha). Seega, distroless-pildilt saime "pingutada" veel 15 MB.

Kogu praeguseks kokku pandud pilte saab vaadata siit.

Projekt — siin.

Kui teil on funktsioonidest puudu, looge lihtsalt paber — olen hea meelega abiks 🙂 Veelgi enam, töötan praegu integratsiooni nimel fetchy teiste paketihalduritega, et mitte oleks vaja teha mitmeastmelisi kogumisi.

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster