[odkaz na americkú detskú rozprávku „Malý parníček, ktorý veril v seba“ („The Little Engine That Could“) — pozn. prekl.]

Ako automaticky vytvárať malé docker obrazy pre svoje potreby
Neobvyklá obsesia
Posledné dva mesiace som bol posadnutý myšlienkou: ako veľmi môžeme zmenšiť Docker obraz, aby aplikácia stále fungovala?
Chápem, že myšlienka je zvláštna.
Predtým, než sa ponorím do detailov a technických záležitostí, chcel by som vysvetliť, prečo ma tento problém tak zaujal a ako sa týka vás.
Prečo má veľkosť význam
Zmenšením obsahu Docker obrazu znižujeme zoznam zraniteľností. Navyše robíme obrazy čistejšími, pretože obsahujú iba to, čo je potrebné na spustenie aplikácií.
Ešte jedno malé plus — obrazy sa sťahujú o niečo rýchlejšie, ale pre mňa to nie je tak dôležité.
Všimnite si: Ak vám záleží na veľkosti, obrazy Alpine sú samy o sebe malé a určite vám budú vyhovovať.
Distroless obrazy
ponúka zbierku základných „distroless“ obrazov, ktoré neobsahujú správcu balíkov, shell a ďalšie nástroje, ktoré ste zvyknutí vidieť v príkazovom riadku. V dôsledku toho nie je možné použiť správcov balíkov ako pip a apt nepríde:
FROM gcr.io/distroless/python3
RUN pip3 install numpyDockerfile, ktorý používa distroless obraz Python 3
Odosielanie kontextu zostavenia Docker daemonu 2.048kB
Krok 1/2 : FROM gcr.io/distroless/python3
---> 556d570d5c53
Krok 2/2 : RUN pip3 install numpy
---> Prebieha v dbfe5623f125
/bin/sh: 1: pip3: nenájdenéPip v obraze nie je
Obvykle sa tento problém rieši pomocou viacstupňového zostavovania:
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é zostavenie
Výsledkom je obraz veľkosti 130MB. Nie je to až také zlé! Pre porovnanie: predvolený obraz Python váži 929MB a "zhubnutý" (3,7-slim) — 179MB, obraz alpine (3,7-alpine) — 98,6MB, zatiaľ čo základný distroless obraz použitý v tomto príklade má 50,9MB.
Môžeme spravodlivo uviesť, že v predchádzajúcom príklade kopírujeme celý adresár /usr/local/lib/python3.7/site-packages, v ktorom môžu ležať nepotrebné závislosti. Hoci je jasné, že rozdiel v veľkostiach všetkých existujúcich základných obrazov Python sa líši.
V čase písania týchto riadkov Google distroless nepodporuje príliš veľa obrazov: Java a Python sú ešte v experimente, a Python existuje len pre 2,7 a 3,5.
Malé obrazy
Vráťme sa k mojej obsedantnej vášni pre vytváranie malých obrazov.
V skutočnosti som chcel vidieť, ako sú usporiadané distroless obrazy. Projekt distroless používa Google nástroj na zostavenie bazel. Avšak, na to, aby som nainštaloval Bazel a napísal vlastné obrazy, som musel zapotiť (a ak budem úprimný, tak znovu vynájsť koleso — to je zábavné a poučné). Chcel som zjednodušiť proces vytvárania zmenšených obrazov: akt vytvárania obrazu by mal byť maximálne jednoduchý, banálny. Bez akýchkoľvek konfiguračných súborov, len jeden príkaz v konzole: jednoducho vytvoriť obraz pre.
A tak, ak chcete vytvárať vlastné obrazy, vedzte: existuje taký unikátny docker obraz, scratch. Scratch je "prázdny" obraz, neobsahuje súbory, hoci zvyčajne váži — wow! — 77 bajtov.
FROM scratchObraz scratch
Myšlienka obrazu scratch je, že môžete skopírovať akékoľvek závislosti z hostiteľského stroja a buď ich použiť v Dockerfile (to je ako ich skopírovať do apt a nainštalovať od nuly), alebo neskôr, keď sa obraz Docker materializuje. To umožňuje úplne kontrolovať obsah Docker kontajnera a tým pádom aj plne kontrolovať veľkosť obrazu.
A teraz potrebujeme nejakým spôsobom zhromaždiť tieto závislosti. Existujúce nástroje ako apt umožňujú sťahovať balíky, ale sú viazané na aktuálny stroj a nakoniec nepodporujú Windows alebo MacOS.
A tak som sa pustil do vytvorenia vlastného nástroja, ktorý by automaticky zostavoval základný obraz s najmenšou možnou veľkosťou a aby ten spustil akúkoľvek aplikáciu. Použil som balíky Ubuntu/Debian, robil výber (získaval balíky priamo z repozitárov) a rekurzívne hľadal ich závislosti. Program by mal automaticky sťahovať najnovšiu stabilnú verziu balíka, pričom by minimalizoval riziká pre bezpečnosť.
Nástroj som nazval fetchy, pretože on... nachádza a prináša... čo potrebujete [z anglického "fetch", "prinášať" — pozn. prekl.]. Nástroj funguje cez rozhranie príkazového riadku, ale zároveň ponúka aj API.
Aby ste mohli zostaviť obraz pomocou fetchy (vezmime si teraz Python obraz), potrebujete len použiť CLI takto: fetchy dockerize python. Môžu vás požiadať o cieľový operačný systém a kódové meno, keďže fetchy aktuálne používa iba balíky založené na Debian a Ubuntu.
Teraz si môžete vybrať, ktoré závislosti sú úplne zbytočné (v našom kontexte) a vylúčiť ich. Napríklad Python závisí od perla, hoci skvele funguje aj bez nainštalovaného Perlu.
Výsledky
Obraz Pythonu vytvorený pomocou príkazu fetchy dockerize python3.5 má iba 35 MB (som si viac ako istý, že v budúcnosti ho bude možné ešte viac zľahčiť). Z distroless obrazu sa podarilo 'odstrihnúť' ďalších 15 MB.
Všetky doteraz zostavené obrazy si môžete pozrieť .
Projekt — .
Ak vám chýbajú funkcie, jednoducho vytvorte žiadosť — rád pomôžem 🙂 Ešte viac, v súčasnosti pracujem na integrácii iných správcov balíkov do fetchy, aby sa zbytočnosť viacerých fázových zostavení odstránila.
Zdroj: habr.com
