Kleine Docker-Bilder, die an sich glaubten *

[Verweis auf das amerikanische Kindermärchen "The Little Engine That Could" - ca. per.] *



So erstellen Sie automatisch winzige Docker-Bilder für Ihre Anforderungen


Ungewöhnliche Besessenheit


In den letzten Monaten war ich von einer Besessenheit besessen: Wie viel kann ich das Docker-Image reduzieren, damit die Anwendung funktioniert?


Ich verstehe, dass die Idee seltsam ist.


Bevor ich mich mit den Details und technischen Problemen befasse, möchte ich erklären, warum mich dieses Problem so sehr beschäftigt hat und wie es Sie betrifft.


Warum Größe wichtig ist


Indem wir den Inhalt des Docker-Images verkürzen, verkürzen wir die Liste der Schwachstellen. Darüber hinaus machen wir Bilder sauberer, da sie nur das enthalten, was Sie zum Ausführen von Anwendungen benötigen.


Es gibt noch einen weiteren kleinen Vorteil: Die Bilder werden etwas schneller heruntergeladen, aber für mich ist dies nicht so wichtig.


Bitte beachten Sie: Wenn Sie sich für die Größe interessieren, sind die alpinen Looks an sich klein und werden Ihnen wahrscheinlich passen.

Distroless Images


Das Distroless-Projekt bietet eine Auswahl grundlegender "Distroless" -Bilder, die nicht die Paketmanager, Shells oder anderen Dienstprogramme enthalten, die Sie normalerweise in der Befehlszeile sehen. Infolgedessen pip Verwendung von Paketmanagern wie pip und apt fehl:


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

Dockerfile mit einem verzweifelten Python 3-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 

Kein Pip im Bild


In der Regel wird dieses Problem durch einen mehrstufigen Build gelöst:


 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/ 

Mehrstufige Montage


Das Ergebnis ist ein Bild mit einer Größe von 130 MB. Nicht so schlimm! Zum Vergleich: Das Python-Image wiegt standardmäßig 929 MB und das „dünnere“ ( 3,7-slim ) - 179 MB, das alpine ( 3,7-alpine ) Bild - 98,6 MB, während das im Beispiel verwendete grundlegende beunruhigungslose Bild ist 50,9 MB.


Wir können zu Recht darauf hinweisen, dass wir im vorherigen Beispiel das gesamte Verzeichnis /usr/local/lib/python3.7/site-packages kopieren, das möglicherweise unnötige Abhängigkeiten zu uns enthält. Obwohl klar ist, dass der Größenunterschied aller vorhandenen Python-Basisimages variiert.


Zum Zeitpunkt des Schreibens dieser Zeilen unterstützt Google Distroless nicht viele Bilder: Java und Python befinden sich noch im experimentellen Stadium, und Python existiert nur für 2.7 und 3.5.

Winzige Bilder


Kehren wir zu meiner Besessenheit zurück, kleine Bilder zu erstellen.


Eigentlich wollte ich sehen, wie verzweifelte Bilder funktionieren. Das Distroless-Projekt verwendet das Google Bazel Build bazel . Um Bazel zu installieren und eigene Bilder zu schreiben, musste ich schwitzen (und um ganz ehrlich zu sein, macht es Spaß und ist informativ, das Rad neu zu erfinden). Ich wollte die Erstellung reduzierter Bilder vereinfachen: Die Erstellung eines Bildes sollte äußerst einfach und banal sein . Damit Sie keine Konfigurationsdateien haben, nur eine Zeile in der Konsole: <> .


Wenn Sie also Ihre eigenen Bilder erstellen möchten, wissen Sie: Es gibt ein so einzigartiges Docker-Bild, scratch . Scratch ist ein "leeres" Bild, es hat keine Dateien, obwohl es standardmäßig wiegt - wow! - 77 Bytes.


 FROM scratch 

Kratzbild


Die Idee eines Scratch-Images ist, dass Sie alle Abhängigkeiten vom Host-Computer in diesen kopieren und sie entweder in der Docker-Datei verwenden können (so kopieren Sie sie in apt und installieren von Grund auf neu) oder später, wenn das Docker-Image materialisiert ist. Auf diese Weise können Sie den Inhalt des Docker-Containers vollständig steuern und somit die Größe des Bildes vollständig steuern.


Und jetzt müssen wir diese Abhängigkeiten irgendwie sammeln. Mit vorhandenen Tools wie apt können Sie Pakete herunterladen, diese sind jedoch an den aktuellen Computer gebunden und unterstützen Windows oder MacOS letztendlich nicht.


Und so verpflichtete ich mich, mein eigenes Tool zusammenzustellen, das automatisch das Grundbild mit der kleinstmöglichen Größe zusammenstellt und so jede Anwendung startet. Ich habe Ubuntu / Debian-Pakete verwendet, eine Auswahl getroffen (Pakete direkt aus den Repositorys abgerufen) und ihre Abhängigkeiten rekursiv gefunden. Das Programm sollte automatisch die neueste stabile Version des Pakets herunterladen, um Sicherheitsrisiken zu minimieren.


Ich habe das fetchy , weil es ... findet und bringt ... was Sie brauchen [ aus dem Englischen. "holen", "bringen" - ca. trans. ]. Das Tool arbeitet über die Befehlszeilenschnittstelle, bietet jedoch gleichzeitig eine API.


Um ein Image mit fetchy (nehmen wir diesmal ein Python-Image), müssen Sie nur die CLI wie fetchy dockerize python : fetchy dockerize python . Möglicherweise werden Sie nach dem fetchy und dem Codenamen gefragt, da fetchy nur Debian- und Ubuntu-basierte Pakete verwendet.


Jetzt können Sie auswählen, welche Abhängigkeiten (in unserem Kontext) überhaupt nicht benötigt werden, und diese ausschließen. Zum Beispiel hängt Python von Perl ab, obwohl es ohne installiertes Perl hervorragend funktioniert.


Ergebnisse


Das mit dem fetchy dockerize python3.5 Python-Image wiegt nur 35 MB (ich bin mehr als sicher, dass es in Zukunft noch einfacher gemacht werden kann). Es stellt sich heraus, dass wir es mit einem verzweifelten Image geschafft haben, weitere 15 MB zu „rasieren“.


Alle aktuell gesammelten Bilder können hier eingesehen werden .


Das Projekt ist da .


Wenn Sie nicht über genügend Funktionen verfügen, erstellen Sie einfach eine Anwendung - ich helfe Ihnen gerne weiter :) Darüber hinaus arbeite ich derzeit an der Integration anderer Paketmanager in Fetchy, sodass keine mehrstufigen Builds mehr erforderlich sind.

Source: https://habr.com/ru/post/de469947/


All Articles