Apró Docker-képek, amelyek hittek magukban*

[hivatkozás a "The Little Engine That Could" című amerikai gyerekmesére - kb. sáv]*

Apró Docker-képek, amelyek hittek magukban*

Hogyan hozhat létre automatikusan apró Docker-képeket az Ön igényei szerint

Szokatlan megszállottság

Az elmúlt néhány hónapban megszállottan foglalkoztatott a gondolat, hogy mennyivel lehet kisebb egy Docker-kép az alkalmazás futtatása közben?

Értem, furcsa az ötlet.

Mielőtt belemennék a részletekbe és a technikai részletekbe, szeretném elmagyarázni, miért olyan érdekes ez a probléma számomra, és hogyan érinti Önt.

Miért számít a méret

A Docker lemezkép tartalmának csökkentésével csökkentjük a sebezhetőségek listáját. Ezen felül a képeket tisztábbá tesszük, mert csak azt tartalmazzák, ami az alkalmazások futtatásához szükséges.

Van még egy apró előny - a képek egy kicsit gyorsabban töltődnek le, de véleményem szerint ez nem olyan fontos.

Kérjük, vegye figyelembe: Ha aggódik a méret miatt, az Alpine kicsinek tűnik, és biztosan megfelel Önnek.

Distroless képek

Projekt Distroless alapvető „disztráció nélküli” képeket kínál, amelyek nem tartalmaznak csomagkezelőket, shelleket és egyéb segédprogramokat, amelyeket a parancssorban látni szokott. Ennek eredményeként használjon olyan csomagkezelőket, mint a pip и apt nem fog működni:

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

Dockerfile Python 3 disztro nélküli képpel

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 nincs a képen

Általában ezt a problémát többlépcsős felépítéssel oldják meg:

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/

Többlépcsős összeszerelés

Az eredmény egy 130 MB méretű kép. Nem túl rossz! Összehasonlításképpen: az alapértelmezett Python kép súlya 929 MB, a „vékonyabb” pedig (3,7-slim) - 179 MB, alpesi kép (3,7-alpine) 98,6 MB, míg a példában használt disztro nélküli alapkép 50,9 MB.

Helyes kiemelni, hogy az előző példában egy teljes könyvtárat másolunk /usr/local/lib/python3.7/site-packages, amely olyan függőségeket tartalmazhat, amelyekre nincs szükségünk. Bár egyértelmű, hogy az összes meglévő Python alapkép méretbeli különbsége eltérő.

A cikk írásakor a Google distroless nem sok képet támogat: a Java és a Python még csak kísérleti stádiumban vannak, a Python pedig csak a 2,7 és 3,5 verziókhoz létezik.

Apró képek

Visszatérve a kis képek készítésének rögeszméjéhez.

Általában azt szerettem volna látni, hogyan épülnek fel a disztromentes képek. A disztro nélküli projekt a Google építőeszközét használja bazel. A Bazel telepítése és a saját képek megírása azonban sok munkát igényelt (és hogy őszinte legyek, a kerék újrafeltalálása szórakoztató és tanulságos). A kisebb képek létrehozását szerettem volna leegyszerűsíteni: a képalkotásnak rendkívül egyszerűnek kell lennie, banális. Hogy ne legyenek konfigurációs fájlok az Ön számára, csak egy sor a konzolban: просто собрать образ для <приложение>.

Tehát, ha saját képeket szeretne létrehozni, akkor tudja: létezik egy ilyen egyedi docker kép, scratch. A Scratch egy „üres” kép, nincsenek benne fájlok, bár alapból súlya van - hú! - 77 bájt.

FROM scratch

Karcolás kép

A scratch kép ötlete az, hogy a gazdagépről bármilyen függőséget átmásolhat rá, és vagy egy Dockerfile-ban használhatja (ez olyan, mintha apt és telepítse a semmiből), vagy később, amikor a Docker lemezkép megvalósul. Ez lehetővé teszi a Docker tároló tartalmának teljes szabályozását, és így a kép méretének teljes szabályozását.

Most valahogy össze kell gyűjtenünk ezeket a függőségeket. A meglévő eszközök, mint pl apt lehetővé teszik a csomagok letöltését, de azok az aktuális géphez vannak kötve, és végül is nem támogatják a Windows-t vagy a MacOS-t.

Így hát nekiláttam egy saját eszköz megépítésének, amely automatikusan a lehető legkisebb méretű alapképet készíti, és bármilyen alkalmazást futtat. Ubuntu/Debian csomagokat használtam, kiválasztottam (közvetlenül a tárolókból szereztem be a csomagokat), és rekurzív módon megtaláltam a függőségeiket. A programnak automatikusan le kellett volna töltenie a csomag legfrissebb stabil verzióját, a lehető legkisebbre csökkentve a biztonsági kockázatokat.

Elneveztem az eszközt fetchy, mert ő... megtalálja és hozza... ami kell [angolról „hozni”, „hozni” - kb. sáv]. Az eszköz parancssori felületen keresztül működik, ugyanakkor API-t kínál.

Kép összeállításához a segítségével fetchy (ezúttal vegyünk egy Python-képet), csak a CLI-t kell így használni: fetchy dockerize python. Előfordulhat, hogy a rendszer kérni fogja a cél operációs rendszert és kódnevet, mert fetchy jelenleg csak Debian és Ubuntu alapú csomagokat használ.

Most kiválaszthatja, hogy mely függőségekre nincs szükség (a mi kontextusunkban), és kizárhatja őket. Például a Python a perl-től függ, bár jól működik Perl telepítése nélkül.

Álláspontja

A paranccsal létrehozott Python-kép fetchy dockerize python3.5 mindössze 35 MB (több mint biztos vagyok benne, hogy a jövőben még könnyebbé lehet tenni). Kiderült, hogy sikerült még 15 WW-t leborotválnunk a disztromentes képből.

Az összes eddig összegyűjtött képet megtekintheti itt.

Projekt - itt.

Ha hiányoznak a funkciók, csak hozzon létre egy kérést - szívesen segítek :) Sőt, jelenleg azon dolgozom, hogy más csomagkezelőket integráljak a fetchy-be, hogy ne legyen szükség többlépcsős buildekre.

Forrás: will.com

Hozzászólás