Tiny Docker slike koje su vjerovale u sebe*

[referenca na američku dječju bajku "Mali motor koji bi mogao" - cca. traka]*

Tiny Docker slike koje su vjerovale u sebe*

Kako automatski kreirati male Docker slike za svoje potrebe

Unusual Obsession

Proteklih nekoliko mjeseci bio sam opsjednut koliko mala Docker slika može biti i još uvijek ima pokrenutu aplikaciju?

Razumijem, ideja je čudna.

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

Zašto je veličina važna

Smanjenjem sadržaja Docker slike, time smanjujemo listu 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 preuzimaju malo brže, ali, po mom mišljenju, to nije toliko važno.

Imajte na umu: ako ste zabrinuti zbog veličine, sami Alpine izgledi su mali i vjerovatno će vam odgovarati.

Distroless images

Project Distroless nudi izbor osnovnih “distroless” slika, ne sadrže menadžere paketa, ljuske i druge uslužne programe koje ste navikli da vidite na komandnoj liniji. Kao rezultat, koristite menadžere paketa kao što su pip и apt neće raditi:

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

Dockerfile koji koristi Python 3 distroless sliku

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 višestepenom izgradnjom:

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

Rezultat je slika veličine 130MB. Nije loše! Za poređenje: zadana slika Pythona je teška 929MB, a "tanja" (3,7-slim) - 179MB, alpska slika (3,7-alpine) je 98,6 MB, dok je osnovna distroless slika korištena u primjeru 50,9 MB.

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

U vrijeme pisanja ovog teksta, 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.

Tiny images

Da se vratim na moju opsesiju kreiranjem malih slika.

Generalno, želeo sam da vidim kako se konstruišu slike bez distrole. Distroless projekat koristi Googleov alat za izgradnju bazel. Međutim, instaliranje Bazela i pisanje vlastitih slika zahtijevalo je mnogo posla (i da budem iskren, ponovno izmišljanje točka je zabavno i poučno). Želio sam pojednostaviti kreiranje manjih slika: čin kreiranja slike trebao bi biti krajnje jednostavan, banalan. Tako da nema konfiguracionih fajlova za vas, samo jedan red u konzoli: просто собрать образ для <приложение>.

Dakle, ako želite da kreirate sopstvene slike, znajte: postoji tako jedinstvena docker slika, scratch. Scratch je "prazna" slika, u njoj nema datoteka, iako je po defaultu teška - wow! - 77 bajtova.

FROM scratch

Scratch image

Ideja scratch slike je da možete kopirati bilo koju ovisnost sa glavnog računala u nju i ili ih koristiti unutar Dockerfile-a (ovo je kao da ih kopirate u apt i instalirajte od nule), ili kasnije kada se Docker slika materijalizira. Ovo vam omogućava da u potpunosti kontrolišete sadržaj Docker kontejnera, a samim tim i da u potpunosti kontrolišete veličinu slike.

Sada moramo nekako prikupiti ove zavisnosti. Postojeći alati poput apt omogućavaju preuzimanje paketa, ali su oni vezani za trenutnu mašinu i, na kraju krajeva, ne podržavaju Windows ili MacOS.

Zato sam krenuo da napravim sopstveni alat koji bi automatski napravio osnovnu sliku najmanje moguće veličine i pokrenuo bilo koju aplikaciju. Koristio sam Ubuntu/Debian pakete, napravio selekciju (dobivanje paketa direktno iz spremišta) 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.

Dao sam ime alatu fetchy, jer on... nađe i donese... šta treba [sa engleskog “donesi”, “donesi” - cca. lane]. Alat radi kroz interfejs komandne linije, ali istovremeno nudi API.

Da biste sastavili sliku koristeći fetchy (uzmimo sliku na Python-u), samo trebate koristiti CLI ovako: fetchy dockerize python. Od vas će se možda tražiti ciljni operativni sistem i kodno ime jer fetchy trenutno koristi samo pakete bazirane 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 perl-u, iako radi dobro bez instaliranog Perla.

Rezulʹtaty

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

Možete vidjeti sve do sada prikupljene slike ovdje.

Projekat - ovdje.

Ako vam nedostaju funkcije, samo kreirajte zahtjev - rado ću vam pomoći :) Štaviše, trenutno radim na integraciji drugih menadžera paketa u fetchy, tako da nema potrebe za višestepenim buildovima.

izvor: www.habr.com

Dodajte komentar