Tiny Docker Biller déi u sech selwer gegleeft hunn *

[Referenz op dat amerikanescht Kanner Mäerchen "The Little Engine That Could" - ca. Strooss]*

Tiny Docker Biller déi u sech selwer gegleeft hunn *

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

Projet Distroless bitt eng Auswiel u Basis "distroless" Biller, si enthalen keng Packagemanager, Muschelen an aner Utilitys déi Dir gewinnt sidd op der Kommandozeil ze gesinn. Als Resultat benotze Package Manager wéi 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 hei.

Projet - hei.

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

Setzt e Commentaire