Majhne slike Dockerja, ki so verjele vase*

[Reference to the American children's tale "The Little Engine That Could" — translator's note]*

Majhne slike Dockerja, ki so verjele vase*

Kako automatski stvarati minijaturne Docker slike za svoje potrebe

Neobična opsesija

Poslednjih nekoliko meseci bio sam opsednut fiks idejom: koliko mogu smanjiti Docker sliku a da pri tome aplikacija i dalje funkcioniše?

Razumem, ideja je čudna.

Pre nego što se upustim u detalje i tehničke zamršenosti, voleo bih da objasnim zašto me ovaj problem toliko zaintrigirao i kako se to odnosi na vas.

Zašto veličina ima značaj

Smanjivanjem sadržaja Docker slike, samim tim smanjujemo i listu ranjivosti. Dodatno, činjenično čistačemo slike, jer sadrže samo ono što je potrebno za pokretanje aplikacija.

Postoji još jedna mala prednost — slike se preuzimaju malo brže, ali, po meni, to nije toliko bitno.

Obratite pažnju: Ako vam je važna veličina, Alpine slike su same po sebi male i verovatno će vam odgovarati.

Distroless slike

Projekat Distroless nudi kolekciju osnovnih 'distroless' slika, one ne sadrže menadžere paketa, shell-ove i druge alate koje ste navikli videti u komandnoj liniji. Kao rezultat toga, korišćenje menadžera paketa poput pip in apt nije moguće:

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

Dockerfile koristeći distroless sliku Python 3

Slanje konteksta izgradnje Docker daemonu  2.048kB
Korak 1/2 : FROM gcr.io/distroless/python3
 ---> 556d570d5c53
Korak 2/2 : RUN  pip3 install numpy
 ---> U toku u dbfe5623f125
/bin/sh: 1: pip3: nije pronađen

Pip nije prisutan u slici

Obično se ovaj problem rešava korišćenjem višestepene izgradnje:

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/

Višestepska izgradnja

Kao rezultat se dobija slika veličine 130 MB. Nije loše! Za poređenje: podrazumevana Python slika teži 929 MB, dok je 'skinuta' (3.7-slim) — 179 MB, dok slika alpine (3.7-alpine) — 98.6MB, dok osnovna distroless slika korišćena u primeru ima 50.9MB.

Može se pravedno navesti da u prethodnom primeru kopiramo čitav katalog /usr/local/lib/python3.7/site-packages, u kojem se mogu nalaziti nepotrebne zavisnosti. Iako je jasno da se razlika u veličinama svih postojećih osnovnih Python slika kreće.

U trenutku pisanja ovog teksta, Google distroless ne podržava mnogo slika: Java i Python su još u eksperimentalnoj fazi, a Python postoji samo za 2.7 i 3.5.

Minijaturne slike

Vrhnimo se k moji obsedenosti z ustvarjanjem manjših slik.

Želel sem si ogledati, kako so narejene distroless slike. Projekt distroless uporablja Google-ovo orodje za gradnjo bazel. Vendar pa je bilo treba za namestitev Bazela in pisanje lastnih slik precej truda (in, da bom povsem iskren, ponovno izumljati kolo — to je zabavno in poučno). Želel sem poenostaviti ustvarjanje zmanjšanih slik: akt ustvarjanja slike bi moral biti izjemno preprost, banalen. Da ne bi bilo nobenih konfiguracijskih datotek, le ena vrstica v konzoli: enostavno sestaviti sliko za.

Torej, če želite ustvariti svoje slike, vedite: obstaja edinstvena docker slika, scratch. Scratch je "prazna" slika, v njej ni datotek, čeprav ima privzeto težo — wow! — 77 bajtov.

FROM scratch

Slika scratch

Ideja slike scratch je v tem, da lahko vanjo kopirate vse odvisnosti s gostiteljske naprave in jih bodisi uporabite znotraj Dockerfile (kot da bi jih kopirali v apt in namestili od začetka), bodisi kasneje, ko je Docker slika materializirana. To omogoča popoln nadzor nad vsebino Docker kontejnerja, in tako popoln nadzor nad velikostjo slike.

Zdaj pa moramo nekako zgraditi te odvisnosti. Obstoječa orodja, kot apt omogočajo prenos paketov, a so vezana na trenutno napravo in na koncu ne podpirajo Windows ali MacOS.

In tako sem se lotil ustvarjanja lastnega orodja, ki bi samodejno zgradilo osnovno sliko najmanjše možne velikosti in bi ta še vedno zagnala katero koli aplikacijo. Uporabil sem pakete Ubuntu/Debian, naredil vzorec (pridobival sem pakete neposredno iz repozitorijev) in rekurzivno našel njihove odvisnosti. Program bi moral samodejno prenesti najnovejšo stabilno različico paketa, kar bi zmanjšalo varnostna tveganja.

Orodje sem poimenoval fetchy, ker on… najde in prinese… kar potrebujete [iz angleščine „fetch“, „prinašati“ — op. prev.]. Orodje deluje prek ukazne vrstice, hkrati pa ponuja tudi API.

Da bi zgradili sliko s pomočjo fetchy (tokrat bomo vzeli sliko Python), morate samo uporabiti CLI tako: fetchy dockerize python. Morda vas bodo vprašali za ciljno operacijsko sistem in kodno ime, saj fetchy trenutno uporablja le pakete, ki temeljijo na Debianu in Ubuntuju.

Zdaj lahko izbirate, katere odvisnosti so v našem kontekstu povsem nepotrebne in jih izključite. Na primer, Python je odvisen od perla, čeprav odlično deluje tudi brez nameščenega perla.

Rezultati

Slika Pythona, ustvarjena z ukazom fetchy dockerize python3.5 tehta le 35 MB (sem prepričan, da ga bo v prihodnosti mogoče še dodatno zmanjšati). Iz distroless slike se je uspešno 'odrezalo' še 15 MB.

Vse do zdaj zbrane slike si lahko ogledate ovde.

Projekt — tukaj.

Če vam manjkajo funkcije, kar ustvarite zahtevo — z veseljem vam bom pomagal 🙂 Še več, trenutno delam na integraciji drugih paketnih upravljavcev v fetchy, da bomo odpravili potrebo po večstopenjskih gradnjah.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster