Majhne slike Dockerja, ki so verjele vase*

[referenca na ameriško otroško pravljico "The Little Engine That Could" - pribl. pas]*

Majhne slike Dockerja, ki so verjele vase*

Kako samodejno ustvariti majhne slike Docker za vaše potrebe

Nenavadna obsedenost

Zadnjih nekaj mesecev sem bil obseden s tem, kako majhna je lahko Dockerjeva slika, aplikacija pa še vedno deluje?

Razumem, ideja je čudna.

Preden se spustim v podrobnosti in tehnične podrobnosti, bi rad pojasnil, zakaj me ta težava tako moti in kako skrbi vas.

Zakaj je velikost pomembna

Z zmanjšanjem vsebine slike Docker s tem zmanjšamo seznam ranljivosti. Poleg tega naredimo slike čistejše, saj vsebujejo le tisto, kar je potrebno za delovanje aplikacij.

Obstaja še ena majhna prednost - slike se prenašajo nekoliko hitreje, vendar po mojem mnenju to ni tako pomembno.

Prosimo, upoštevajte: Če vas skrbi velikost, je videz Alpine majhen in vam bo verjetno ustrezal.

Slike brez distribucije

Projekt Distroless ponuja izbor osnovnih slik brez distribucije, ne vsebujejo upraviteljev paketov, lupin in drugih pripomočkov, ki ste jih vajeni videti v ukazni vrstici. Zato uporabite upravitelje paketov, kot je pip и apt ne bo delovalo:

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

Dockerfile z uporabo slike brez distribucije Python 3

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 ni na sliki

Običajno se ta problem reši z večstopenjsko gradnjo:

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/

Večstopenjska montaža

Rezultat je slika velikosti 130 MB. Ni preslabo! Za primerjavo: privzeta Pythonova slika tehta 929MB, »tanjša« (3,7-slim) - 179MB, alpska slika (3,7-alpine) je 98,6 MB, medtem ko je osnovna slika brez distribucije, uporabljena v primeru, 50,9 MB.

Pošteno je poudariti, da v prejšnjem primeru kopiramo celoten imenik /usr/local/lib/python3.7/site-packages, ki lahko vsebuje odvisnosti, ki jih ne potrebujemo. Čeprav je jasno, da se razlika v velikosti vseh obstoječih osnovnih slik Python razlikuje.

V času pisanja Google distroless ne podpira veliko slik: Java in Python sta še vedno v poskusni fazi, Python pa obstaja samo za 2,7 in 3,5.

Majhne slike

Nazaj k moji obsedenosti z ustvarjanjem majhnih slik.

Na splošno sem želel videti, kako so zgrajene slike brez distrosov. Projekt brez distribucije uporablja Googlovo orodje za gradnjo bazel. Vendar sta namestitev Bazela in pisanje lastnih slik zahtevala veliko dela (in če sem iskren, je ponovno odkrivanje kolesa zabavno in poučno). Želel sem poenostaviti ustvarjanje manjših slik: dejanje ustvarjanja slike mora biti izjemno preprosto, banalno. Tako da za vas ni konfiguracijskih datotek, samo ena vrstica v konzoli: просто собрать образ для <приложение>.

Torej, če želite ustvariti svoje lastne slike, vedite: obstaja tako edinstvena slika dockerja, scratch. Scratch je "prazna" slika, v njej ni datotek, čeprav privzeto tehta - vau! - 77 bajtov.

FROM scratch

Scratch slika

Ideja scratch slike je, da lahko vanj kopirate vse odvisnosti iz gostiteljskega računalnika in jih bodisi uporabite znotraj datoteke Dockerfile (to je kot kopiranje v apt in namestite iz nič), ali pozneje, ko je slika Docker materializirana. To vam omogoča popoln nadzor nad vsebino vsebnika Docker in s tem popoln nadzor nad velikostjo slike.

Zdaj moramo te odvisnosti nekako zbrati. Obstoječa orodja, kot je apt vam omogočajo prenos paketov, vendar so vezani na trenutno napravo in navsezadnje ne podpirajo Windows ali MacOS.

Zato sem se odločil zgraditi lastno orodje, ki bi samodejno zgradilo osnovno sliko najmanjše možne velikosti in tudi poganjalo katero koli aplikacijo. Uporabil sem pakete Ubuntu/Debian, naredil izbor (pridobil pakete neposredno iz repozitorijev) in rekurzivno našel njihove odvisnosti. Program naj bi samodejno prenesel najnovejšo stabilno različico paketa, s čimer bi čim bolj zmanjšal varnostna tveganja.

Orodje sem poimenoval fetchy, ker on ... najde in prinese ... kar je potrebno [iz angleščine "prinesi", "prinesi" - pribl. vozni pas]. Orodje deluje prek vmesnika ukazne vrstice, a hkrati ponuja API.

Če želite sestaviti sliko z uporabo fetchy (tokrat vzemimo sliko Python), CLI morate uporabiti takole: fetchy dockerize python. Morda boste morali vnesti ciljni operacijski sistem in kodno ime, ker fetchy trenutno uporablja samo pakete, ki temeljijo na Debianu in Ubuntuju.

Zdaj lahko izberete, katere odvisnosti sploh niso potrebne (v našem kontekstu) in jih izključite. Na primer, Python je odvisen od perla, čeprav dobro deluje brez nameščenega Perla.

Ugotovitve

Slika Python, ustvarjena z ukazom fetchy dockerize python3.5 tehta samo 35 MB (več kot prepričan sem, da ga bo v prihodnosti mogoče še olajšati). Izkazalo se je, da nam je uspelo obriti še 15 WW iz distroless slike.

Ogledate si lahko vse do sedaj zbrane slike tukaj.

projekt - tukaj.

Če vam manjkajo funkcije, samo ustvarite zahtevo - z veseljem vam bom pomagal :) Še več, trenutno delam na integraciji drugih upraviteljev paketov v fetchy, tako da ni potrebe po večstopenjski gradnji.

Vir: www.habr.com

Dodaj komentar