[Referenz op dat amerikanescht Kanner Mäerchen "The Little Engine That Could" - ca. Strooss]*
Wéi automatesch kleng Docker Biller fir Är Besoinen erstellen
Ongewéinlech Obsessioun
Fir déi lescht puer Méint sinn ech obsesséiert mat wéi kleng en Docker-Bild ka sinn an ëmmer nach d'Applikatioun lafen?
Ech verstinn, d'Iddi ass komesch.
Ier ech an d'Detailer an d'Technik kommen, wëll ech erkläre firwat dëse Problem mech sou gestéiert huet a wéi et Iech betrëfft.
Firwat ass d'Gréisst wichteg
Duerch d'Reduktioun vum Inhalt vum Docker-Bild reduzéieren mir domat d'Lëscht vu Schwachstelle. Zousätzlech maache mir d'Biller méi propper, well se enthalen nëmmen dat wat néideg ass fir Uwendungen ze lafen.
Et gëtt nach ee klenge Virdeel - Biller ginn e bësse méi séier erofgelueden, awer menger Meenung no ass dat net sou wichteg.
Notéiert w.e.g.: Wann Dir Iech iwwer d'Gréisst besuergt sidd, sinn d'Alpine Looks selwer kleng a passen Iech wahrscheinlech.
Distroless Biller
pip
и apt
wäert net schaffen:
FROM gcr.io/distroless/python3
RUN pip3 install numpy
Dockerfile benotzt Python 3 distroless Bild
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 ass net am Bild
Normalerweis gëtt dëse Problem duerch e Multi-Stage Build geléist:
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/
Multi-Etapp Assemblée
D'Resultat ass e Bild vun 130MB an der Gréisst. Net ze schlecht! Zum Verglach: d'Default Python Bild weegt 929MB, an déi "dënn" (3,7-slim
) - 179 MB, alpine Bild (3,7-alpine
) ass 98,6MB, während d'Basis distroless Bild am Beispill benotzt 50,9MB ass.
Et ass fair ze weisen datt am virege Beispill mir e ganze Verzeechnes kopéieren /usr/local/lib/python3.7/site-packages
, déi Ofhängegkeete kënnen enthalen déi mir net brauchen. Och wann et kloer ass datt d'Gréisst Ënnerscheed vun all existent Python Basisbiller variéiert.
Zu der Zäit vum Schreiwen ënnerstëtzt Google distroless net vill Biller: Java a Python sinn nach ëmmer an der experimenteller Etapp, a Python existéiert nëmme fir 2,7 an 3,5.
Kleng Biller
Zréck op meng Obsessioun fir kleng Biller ze kreéieren.
Am Allgemengen wollt ech kucken wéi distroless Biller konstruéiert sinn. Den distroless Projet benotzt dem Google säi Build-Tool bazel
. Wéi och ëmmer, Bazel z'installéieren an Är eege Biller ze schreiwen huet vill Aarbecht gemaach (a fir éierlech ze sinn, d'Rad nei ze erfannen ass lëschteg a pädagogesch). Ech wollt d'Schafe vu méi klenge Biller vereinfachen: d'Aktioun fir e Bild ze kreéieren sollt extrem einfach sinn, banal. Also datt et keng Konfiguratiounsdateien fir Iech sinn, just eng Zeil an der Konsole: просто собрать образ для <приложение>
.
Also, wann Dir wëllt Är eege Biller erstellen, da wësst: et gëtt sou en eenzegaartegt Docker Bild, scratch
. Scratch ass en "eidel" Bild, et gi keng Dateien dran, obwuel et par défaut weit - wow! -77 Bytes.
FROM scratch
Schrummen Bild
D'Iddi vun engem Scratch Bild ass datt Dir all Ofhängegkeete vun der Hostmaschinn an et kopéiere kënnt an entweder se an enger Dockerfile benotzen (dëst ass wéi se ze kopéieren op apt
an installéiert vun Null), oder spéider wann d'Docker-Bild materialiséiert ass. Dëst erlaabt Iech den Inhalt vum Docker Container komplett ze kontrolléieren an domat d'Gréisst vum Bild komplett ze kontrolléieren.
Elo musse mir iergendwéi dës Ofhängegkeeten sammelen. Bestehend Tools wéi apt
erlaabt Iech Packagen erofzelueden, awer si sinn un déi aktuell Maschinn gebonnen an ënnerstëtzen schliisslech net Windows oder MacOS.
Also hunn ech virgestallt fir mäin eegent Tool ze bauen dat automatesch e Basisbild vun der klengster méiglecher Gréisst géif bauen an och all Applikatioun lafen. Ech hunn Ubuntu / Debian Packagen benotzt, eng Selektioun gemaach (Paketen direkt vun de Repositories kréien) a rekursiv hir Ofhängegkeeten fonnt. De Programm sollt automatesch déi lescht stabil Versioun vum Package eroflueden, sou datt d'Sécherheetsrisiken sou vill wéi méiglech miniméiert.
Ech hunn den Tool genannt fetchy
, well hien... fënnt a bréngt... wat gebraucht gëtt [aus Englesch "fetch", "bring" - ca. laan]. D'Tool funktionnéiert duerch eng Kommandozeil-Interface, awer gläichzäiteg bitt eng API.
Fir e Bild ze sammelen benotzt fetchy
(loosst eis e Python-Bild dës Kéier huelen), Dir musst just den CLI esou benotzen: fetchy dockerize python
. Dir kënnt fir d'Zilbetribssystem a Codenumm gefrot ginn, well fetchy
benotzt de Moment nëmmen Packagen baséiert op Debian an Ubuntu.
Elo kënnt Dir wielen wéi eng Ofhängegkeeten guer net gebraucht ginn (an eisem Kontext) an auszeschléissen. Zum Beispill hänkt Python vu Perl of, obwuel et gutt funktionnéiert ouni Perl installéiert.
Resultater
Python Bild erstallt mam Kommando fetchy dockerize python3.5
weit nëmmen 35MB (ech si méi wéi sécher datt et an Zukunft nach méi hell ka gemaach ginn). Et stellt sech eraus datt mir et fäerdeg bruecht hunn eng aner 15 WW aus dem distroless Bild ze raséieren.
Dir kënnt all d'Biller gesinn, déi bis elo gesammelt goufen
Projet -
Wann Dir Features fehlt, erstellt einfach eng Ufro - ech wäert gären hëllefen :) Nach méi, ech schaffen am Moment un der Integratioun vun anere Package Manager an fetchy, sou datt et kee Besoin fir Multi-Stage Builds ass.
Source: will.com