Drobné obrázky Docker, ktoré verili v seba*

[odkaz na americkú detskú rozprávku "The Little Engine That Could" - cca. pruh]*

Drobné obrázky Docker, ktoré verili v seba*

Ako automaticky vytvárať malé obrázky Docker pre vaše potreby

Nezvyčajná posadnutosť

Posledných pár mesiacov som bol posadnutý tým, aký malý môže byť obraz Dockeru a aplikácia stále beží?

Rozumiem, nápad je zvláštny.

Skôr než sa dostanem k podrobnostiam a technickým podrobnostiam, rád by som vysvetlil, prečo ma tento problém tak trápil a ako sa týka vás.

Prečo na veľkosti záleží

Zmenšením obsahu obrazu Docker znižujeme zoznam zraniteľností. Obrázky navyše robíme čistejšími, pretože obsahujú len to, čo je potrebné na spustenie aplikácií.

Je tu ešte jedna malá výhoda - obrázky sa sťahujú o niečo rýchlejšie, ale to podľa mňa nie je také dôležité.

Poznámka: Ak máte obavy z veľkosti, samotné alpské modely sú malé a pravdepodobne vám budú sedieť.

Obrázky bez distribúcie

Projekt Distroless ponúka výber základných „distroless“ obrazov, neobsahujú správcov balíkov, shelly a iné nástroje, ktoré ste zvyknutí vidieť na príkazovom riadku. V dôsledku toho použite správcov balíkov ako pip и apt nebudem pracovať:

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

Dockerfile používajúci obraz bez distroly 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 nie je na obrázku

Tento problém sa zvyčajne rieši viacstupňovou zostavou:

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/

Viacstupňová montáž

Výsledkom je obrázok s veľkosťou 130 MB. Nie príliš zlé! Pre porovnanie: predvolený obrázok Pythonu váži 929 MB a „tenší“ (3,7-slim) – 179 MB, alpský obrázok (3,7-alpine) je 98,6 MB, zatiaľ čo základný obraz bez distroly použitý v príklade je 50,9 MB.

Je spravodlivé zdôrazniť, že v predchádzajúcom príklade kopírujeme celý adresár /usr/local/lib/python3.7/site-packages, ktorý môže obsahovať závislosti, ktoré nepotrebujeme. Aj keď je jasné, že rozdiel vo veľkosti všetkých existujúcich základných obrázkov Pythonu sa líši.

V čase písania tohto článku Google distroless nepodporuje veľa obrázkov: Java a Python sú stále v experimentálnej fáze a Python existuje len pre 2,7 a 3,5.

Drobné obrázky

Späť k mojej posadnutosti vytváraním malých obrázkov.

Vo všeobecnosti som chcel vidieť, ako sú konštruované obrázky bez distroly. Projekt distroless využíva nástroj na zostavovanie spoločnosti Google bazel. Inštalácia Bazelu a písanie vlastných obrázkov si však vyžadovalo veľa práce (a aby som bol úprimný, znovuobjavenie kolesa je zábavné a poučné). Chcel som zjednodušiť vytváranie menších obrázkov: vytvorenie obrázka by malo byť veľmi jednoduché, banálne. Aby pre vás neexistovali žiadne konfiguračné súbory, iba jeden riadok v konzole: просто собрать образ для <приложение>.

Takže, ak si chcete vytvoriť svoje vlastné obrázky, potom vedzte: existuje taký jedinečný obrázok docker, scratch. Scratch je „prázdny“ obrázok, nie sú v ňom žiadne súbory, hoci štandardne váži - wow! - 77 bajtov.

FROM scratch

Poškriabaný obrázok

Myšlienka stieracieho obrázka je, že do neho môžete skopírovať akékoľvek závislosti z hostiteľského počítača a použiť ich buď v súbore Dockerfile (je to ako skopírovanie do apt a nainštalovať od začiatku), alebo neskôr, keď sa zhmotní obraz Docker. To vám umožní úplne ovládať obsah kontajnera Docker, a tým úplne ovládať veľkosť obrázka.

Teraz musíme nejako zhromaždiť tieto závislosti. Existujúce nástroje ako napr apt vám umožňujú sťahovať balíčky, ale sú viazané na aktuálny počítač a koniec koncov nepodporujú Windows ani MacOS.

Pustil som sa teda do zostavenia vlastného nástroja, ktorý by automaticky vytvoril základný obrázok najmenšej možnej veľkosti a zároveň by spustil akúkoľvek aplikáciu. Použil som balíky Ubuntu/Debian, urobil som výber (získanie balíkov priamo z repozitárov) a rekurzívne som našiel ich závislosti. Program si mal automaticky stiahnuť najnovšiu stabilnú verziu balíka, čím sa v maximálnej možnej miere minimalizujú bezpečnostné riziká.

Pomenoval som nástroj fetchy, pretože on... nájde a prinesie... čo treba [z angličtiny „priniesť“, „priniesť“ - cca. pruh]. Nástroj funguje cez rozhranie príkazového riadku, no zároveň ponúka API.

Na zostavenie obrazu pomocou fetchy (tentoraz si vezmeme obrázok Pythonu), stačí použiť CLI takto: fetchy dockerize python. Môžete byť požiadaní o cieľový operačný systém a kódové meno, pretože fetchy v súčasnosti používa iba balíčky založené na Debiane a Ubuntu.

Teraz si môžete vybrať, ktoré závislosti nie sú vôbec potrebné (v našom kontexte) a vylúčiť ich. Napríklad Python závisí od perlu, hoci funguje dobre aj bez nainštalovaného Perlu.

výsledky

Obrázok Pythonu vytvorený pomocou príkazu fetchy dockerize python3.5 váži len 35 MB (som si viac než istý, že v budúcnosti sa to dá ešte odľahčiť). Ukazuje sa, že sa nám podarilo oholiť ďalších 15 WW z obrazu distroless.

Môžete vidieť všetky doteraz zozbierané obrázky tu.

projekt - tu.

Ak vám chýbajú funkcie, vytvorte požiadavku - rád pomôžem :) Ba čo viac, momentálne pracujem na integrácii ďalších správcov balíkov do fetchy, aby nebolo treba viacstupňové zostavy.

Zdroj: hab.com

Pridať komentár