Tiny Docker obrázky, které věřily v sebe*

[odkaz na americkou dětskou pohádku "The Little Engine That Could" - cca. pruh]*

Tiny Docker obrázky, které věřily v sebe*

Jak automaticky vytvářet malé obrázky Docker pro vaše potřeby

Neobvyklá posedlost

Posledních pár měsíců jsem byl posedlý myšlenkou, o kolik menší může být obrázek Dockeru, když je aplikace stále spuštěna?

Chápu, nápad je to zvláštní.

Než se pustím do podrobností a technických podrobností, rád bych vysvětlil, proč mě tento problém tak obtěžoval a jak se týká vás.

Proč na velikosti záleží

Zmenšením obsahu obrazu Dockeru snížíme seznam zranitelností. Obrázky navíc děláme čistší, protože obsahují pouze to, co je potřeba pro běh aplikací.

Je tu ještě jedna malá výhoda - obrázky se stahují o něco rychleji, ale to podle mého názoru není tak důležité.

Poznámka: Pokud máte obavy z velikosti, samotné modely Alpine jsou malé a pravděpodobně vám budou sedět.

Obrazy bez distribuce

Projekt Distroless nabízí výběr základních „distroless“ obrazů, neobsahují správce balíčků, shelly a další nástroje, které jste zvyklí vídat na příkazovém řádku. V důsledku toho používejte správce balíčků jako pip и apt to nebude fungovat:

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

Dockerfile používající Python 3 distroless image

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 na obrázku není

Obvykle je tento problém vyřešen vícestupňovou sestavou:

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/

Vícestupňová montáž

Výsledkem je obrázek o velikosti 130 MB. Né tak špatné! Pro srovnání: výchozí obrázek Pythonu váží 929 MB a „tenčí“ (3,7-slim) – 179 MB, alpský obrázek (3,7-alpine) je 98,6 MB, zatímco základní obraz bez distribuce použitý v příkladu je 50,9 MB.

Je fér zdůraznit, že v předchozím příkladu kopírujeme celý adresář /usr/local/lib/python3.7/site-packages, který může obsahovat závislosti, které nepotřebujeme. I když je jasné, že velikostní rozdíl všech existujících základních obrázků Pythonu se liší.

V době psaní tohoto článku Google distroless nepodporuje mnoho obrázků: Java a Python jsou stále ve fázi experimentu a Python existuje pouze pro 2,7 a 3,5.

Drobné obrázky

Zpět k mé posedlosti vytvářením malých obrázků.

Obecně jsem chtěl vidět, jak se konstruují obrazy bez distroly. Projekt distroless využívá nástroj Google pro sestavení bazel. Instalace Bazelu a psaní vlastních obrázků však dalo hodně práce (a abych byl upřímný, znovuobjevení kola je zábavné a poučné). Chtěl jsem zjednodušit vytváření menších obrázků: akt vytvoření obrázku by měl být extrémně jednoduchý, banální. Aby pro vás nebyly žádné konfigurační soubory, stačí jeden řádek v konzole: просто собрать образ для <приложение>.

Pokud tedy chcete vytvořit vlastní obrázky, pak vězte: existuje takový jedinečný obrázek dockeru, scratch. Scratch je „prázdný“ obrázek, nejsou v něm žádné soubory, ačkoli ve výchozím nastavení váží – wow! - 77 bajtů.

FROM scratch

Poškrábat obrázek

Myšlenka stíracího obrázku je, že do něj můžete zkopírovat jakékoli závislosti z hostitelského počítače a buď je použít v souboru Dockerfile (je to jako zkopírovat je do apt a nainstalovat od začátku), nebo později, když se zhmotní obraz Dockeru. To vám umožní zcela ovládat obsah kontejneru Docker, a tím zcela ovládat velikost obrázku.

Nyní musíme nějak shromáždit tyto závislosti. Stávající nástroje jako apt umožňují stahovat balíčky, ale jsou vázány na aktuální stroj a koneckonců nepodporují Windows ani MacOS.

Pustil jsem se tedy do sestavení vlastního nástroje, který by automaticky vytvořil základní image co nejmenší velikosti a také spouštěl libovolnou aplikaci. Použil jsem balíčky Ubuntu/Debian, provedl jsem výběr (získání balíčků přímo z repozitářů) a rekurzivně našel jejich závislosti. Program měl automaticky stahovat nejnovější stabilní verzi balíčku a maximálně tak minimalizovat bezpečnostní rizika.

Pojmenoval jsem nástroj fetchy, protože... najde a přinese... co je potřeba [z angličtiny „přinést“, „přinést“ - cca. pruh]. Nástroj funguje přes rozhraní příkazového řádku, ale zároveň nabízí API.

Chcete-li sestavit obrázek pomocí fetchy (tentokrát si vezmeme obrázek Pythonu), stačí použít CLI takto: fetchy dockerize python. Můžete být požádáni o cílový operační systém a kódové jméno, protože fetchy v současnosti používá pouze balíčky založené na Debianu a Ubuntu.

Nyní si můžete vybrat, které závislosti nejsou vůbec potřeba (v našem kontextu) a vyloučit je. Například Python závisí na perlu, i když bez nainstalovaného Perlu funguje dobře.

výsledky

Obraz Pythonu vytvořený pomocí příkazu fetchy dockerize python3.5 váží pouhých 35 MB (jsem si více než jistý, že v budoucnu půjde ještě lehčí). Ukázalo se, že se nám podařilo oholit dalších 15 WW z obrazu distroless.

Můžete si prohlédnout všechny dosud nasbírané snímky zde.

projekt - zde.

Pokud vám funkce chybí, stačí vytvořit požadavek - rád pomůžu :) Ještě více aktuálně pracuji na integraci dalších správců balíčků do fetchy, aby nebylo potřeba vícestupňových sestavení.

Zdroj: www.habr.com

Přidat komentář