[hivatkozás a "The Little Engine That Could" című amerikai gyerekmesére - kb. sáv]*
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
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
Projekt -
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