Sićušne Docker slike koje su vjerovale u sebe*

[referenca na američku dječju bajku "The Little Engine That Could" - pribl. traka]*

Sićušne Docker slike koje su vjerovale u sebe*

Kako automatski stvoriti sićušne Docker slike za svoje potrebe

Neobična opsesija

Posljednjih nekoliko mjeseci bio sam opsjednut time koliko mala Docker slika može biti, a da aplikacija još uvijek radi?

Razumijem, ideja je čudna.

Prije nego što uđem u detalje i tehničke detalje, želio bih objasniti zašto me ovaj problem toliko mučio, a kako se tiče vas.

Zašto je veličina važna

Smanjivanjem sadržaja Docker slike smanjujemo popis ranjivosti. Osim toga, slike činimo čišćima jer sadrže samo ono što je potrebno za pokretanje aplikacija.

Postoji još jedna mala prednost - slike se skidaju malo brže, ali, po mom mišljenju, to nije toliko važno.

Imajte na umu: ako ste zabrinuti zbog veličine, Alpine izgled je mali i vjerojatno će vam pristajati.

Slike bez distribucije

Projekt Distroless nudi izbor osnovnih slika bez distribucije, ne sadrže upravitelje paketa, ljuske i druge pomoćne programe koje ste navikli vidjeti u naredbenom retku. Kao rezultat toga, koristite upravitelje paketa poput pip и apt neće raditi:

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

Dockerfile koji koristi sliku bez 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 nije na slici

Obično se ovaj problem rješava izgradnjom u više faza:

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šestupanjska montaža

Rezultat je slika veličine 130 MB. Nije loše! Za usporedbu: zadana Python slika ima 929 MB, a “tanja” (3,7-slim) - 179MB, alpska slika (3,7-alpine) iznosi 98,6 MB, dok osnovna slika bez distribucije korištena u primjeru iznosi 50,9 MB.

Pošteno je istaknuti da u prethodnom primjeru kopiramo cijeli direktorij /usr/local/lib/python3.7/site-packages, koji može sadržavati ovisnosti koje nam nisu potrebne. Iako je jasno da razlika u veličini svih postojećih Python osnovnih slika varira.

U vrijeme pisanja, Google distroless ne podržava mnogo slika: Java i Python su još uvijek u eksperimentalnoj fazi, a Python postoji samo za 2,7 i 3,5.

Sitne slike

Vratimo se mojoj opsesiji stvaranjem malih slika.

Općenito, želio sam vidjeti kako se konstruiraju slike bez distrozije. Projekt bez distribucije koristi Googleov alat za izgradnju bazel. Međutim, instaliranje Basela i pisanje vlastitih slika iziskivalo je puno posla (i da budem iskren, ponovno izmišljanje kotača je zabavno i poučno). Želio sam pojednostaviti stvaranje manjih slika: čin stvaranja slike trebao bi biti krajnje jednostavan, banalno. Tako da za vas nema konfiguracijskih datoteka, samo jedan redak u konzoli: просто собрать образ для <приложение>.

Dakle, ako želite stvarati vlastite slike, znajte: postoji takva jedinstvena docker slika, scratch. Scratch je "prazna" slika, u njoj nema datoteka, iako prema zadanim postavkama teži - wow! - 77 bajtova.

FROM scratch

Ogrebana slika

Ideja scratch slike je da možete kopirati sve ovisnosti s glavnog računala u nju i koristiti ih unutar Dockerfile (ovo je kao da ih kopirate u apt i instalirati od nule), ili kasnije kada se Docker slika materijalizira. To vam omogućuje potpunu kontrolu sadržaja Docker spremnika, a time i potpunu kontrolu veličine slike.

Sada moramo nekako prikupiti ove ovisnosti. Postojeći alati poput apt omogućuju vam preuzimanje paketa, ali oni su vezani za trenutni stroj i, naposljetku, ne podržavaju Windows ili MacOS.

Stoga sam krenuo u izradu vlastitog alata koji bi automatski izradio osnovnu sliku najmanje moguće veličine i također pokrenuo bilo koju aplikaciju. Koristio sam Ubuntu/Debian pakete, napravio odabir (dobivši pakete izravno iz repozitorija) i rekurzivno pronašao njihove ovisnosti. Program je trebao automatski preuzeti najnoviju stabilnu verziju paketa, minimizirajući sigurnosne rizike što je više moguće.

Imenovao sam alat fetchy, jer on... nalazi i donosi... što treba [s engleskog “donijeti”, “donijeti” - cca. traka]. Alat radi preko sučelja naredbenog retka, ali u isto vrijeme nudi API.

Za sastavljanje slike pomoću fetchy (uzmimo ovaj put Python sliku), samo trebate koristiti CLI ovako: fetchy dockerize python. Od vas se može tražiti ciljni operativni sustav i kodno ime jer fetchy trenutno koristi samo pakete temeljene na Debianu i Ubuntuu.

Sada možete odabrati koje ovisnosti uopće nisu potrebne (u našem kontekstu) i isključiti ih. Na primjer, Python ovisi o perlu, iako radi dobro i bez instaliranog Perla.

Nalazi

Python slika stvorena pomoću naredbe fetchy dockerize python3.5 teži samo 35MB (više sam nego siguran da će u budućnosti biti još lakši). Ispostavilo se da smo uspjeli skinuti još 15 WW sa slike bez distribucije.

Možete vidjeti sve do sada prikupljene slike здесь.

Projekt - ovdje.

Ako vam nedostaju značajke, samo kreirajte zahtjev - rado ću vam pomoći :) Čak štoviše, trenutno radim na integraciji drugih upravitelja paketima u fetchy, tako da nema potrebe za višestupanjskom izgradnjom.

Izvor: www.habr.com

Dodajte komentar