So erstellen Sie Ihre eigenen Docker-Basis-Images von “Scratch”

0
65

Docker-Images werden aus einer Docker-Datei erstellt, die ein Basis-Image und eine Serie definiert von Anweisungen, die Ihre eigenen Dateisystemschichten hinzufügen. Was passiert, wenn Sie Ihr eigenes “Basis-Image” obwohl? So beginnen Sie bei Null und erstellen ein komplettes Container-Dateisystem von Grund auf.

Was ist ein Image?

< p>Docker-Images verwenden im Allgemeinen eine beliebte Linux-Distribution als Basis-Image. Wenn Sie FROM ubuntu:latest, FROM debian:latest oder FROM alpine:latest geschrieben haben, haben Sie ein Betriebssystem als Basis verwendet. Sie können auch ein Image verwenden, das für eine bestimmte Programmiersprache oder ein bestimmtes Framework vorkonfiguriert ist, z. B. FROM php:8.0 oder FROM node:16.

Alle diese Bilder bieten einen nützlichen Ausgangspunkt für Ihre Anwendungen. Sie werden mit gängigen Unix-Dienstprogrammen und wichtigen Softwarepaketen geliefert. Dies alles erhöht jedoch die Größe Ihres endgültigen Bildes. Ein wirklich minimalistisches Image sollte erstellt werden, indem Sie Ihr eigenes Dateisystem nach den ersten Prinzipien erstellen.

Das “Scratch” Image

Docker bietet ein spezielles Basis-Image, das anzeigt, dass Sie die erste Dateisystemschicht steuern möchten. Dies ist die unterste Ebene Ihres Bildes, die normalerweise durch das Basisbild definiert wird, das in Ihrer FROM-Anweisung angegeben ist.

Wenn Sie ein Bild “von Grund auf erstellen” von Grund auf neu in Ihr Dockerfile zu schreiben ist der richtige Weg! Dadurch erhalten Sie ein Dateisystem, das von vornherein ein leeres Blatt ist.

Von Grund auf neu Werbung

Sie sollten dann den Rest Ihres Dockerfiles wie gewohnt verwenden, um das Dateisystem des Containers mit . zu füllen die Binärdateien und Bibliotheken, die Sie benötigen.

Was ist “Scratch”?

Der Kratzer “Bild” sieht aus und fühlt sich an wie ein normales Docker-Image. Es ist sogar im Docker Hub aufgeführt. Scratch ist nicht wirklich ein Bild – Es ist ein reserviertes Schlüsselwort, das die unterste Dateisystemschicht eines funktionierenden Images bezeichnet. Alle Docker-Images befinden sich als gemeinsame Grundlage auf Scratch.

Sie können Scratch nicht von Docker ziehen und Container können damit nicht ausgeführt werden. Es stellt eine leere Bildebene dar, sodass Docker nichts ausführen kann. Bilder können aufgrund ihrer Zurückhaltung auch nicht als Scratch-Bilder markiert werden.

Was kann Scratch-basierten Bildern hinzugefügt werden?< /h2>

Sie brauchen nicht viel, um ein funktionierendes Image auf dem Scratch aufzubauen. Alles, was Sie hinzufügen müssen, ist eine statisch kompilierte Linux-Binärdatei, die Sie als Befehl für Ihr Image verwenden können.

Hier ist eine funktionierende Demo, die eine kleine “Hallo Welt&#8221 . ausführt ; aus C kompiliertes Programm:

#include <stdio.h>   int main() { printf("Hallo Welt"); 0 zurückgeben; }

Kompilieren Sie Ihren C-Code zu einer Binärdatei:

gcc -o helloworld hello.c

Führen Sie Ihre Binärdatei aus und beobachten Sie, dass “hello world” wird auf Ihrem Terminal gedruckt:

./helloworld Advertisement

Jetzt können Sie einen Scratch-basierten Docker-Container erstellen, der Ihre Binärdatei ausführt:

FROM scratch COPY helloworld/CMD [“helloworld”]

Erstellen Sie Ihr Image:

docker build -t hello:latest .

Wenn Sie das Bild mit Docker Inspect überprüfen, wird angezeigt, dass es eine einzelne Ebene hat. Das Dateisystem dieses Images enthält nur eine Datei, die helloworld-Binärdatei.

Führen Sie jetzt einen Container mit Ihrem Image aus:

docker run hello:latest

Sie sehen “Hallo Welt” in Ihrem Terminal, während Ihre kompilierte Binärdatei ausgeführt wird. Ihr Scratch-basiertes Image enthält ausschließlich Ihre Binärdatei, sodass es nur wenige KBs groß ist. Die Verwendung eines beliebigen Basis-Images des Betriebssystems würde dies auf mehrere Megabyte erhöhen, selbst bei einer minimalen Verteilung wie Alpine.

Praktisch alle Bilder weisen einige Abhängigkeiten auf, die über eine einfache statische Binärdatei hinausgehen. Diese müssen Sie Ihrem Image als Teil Ihres Dockerfiles hinzufügen. Denken Sie daran, dass keines der Tools, die Sie in Standard-Linux-Distributionen für selbstverständlich halten, verfügbar ist, bis Sie sie manuell zum Dateisystem des Images hinzufügen.

Wann Sie Scratch verwenden?

Die Entscheidung, bei Null anzufangen, sollte auf den Abhängigkeiten Ihrer Anwendung und Ihren Zielen in Bezug auf die Bildübertragbarkeit basieren. Von Grund auf neu erstellte Bilder eignen sich am besten zum Hosten statisch kompilierter Binärdateien, bei denen die Bildgröße und die Build-Zeiten eine Rolle spielen.

Scratch bietet Ihnen eine saubere Arbeitsgrundlage, sodass Sie einige Anfangsinvestitionen benötigen, um Ihr Dockerfile korrekt zu schreiben und im Laufe der Zeit zu pflegen. Einige Docker-Befehle wie Attach funktionieren standardmäßig nicht, da es keine Shell in Ihrem Container gibt, es sei denn, Sie fügen eine hinzu.

Werbung

Die Verwendung von Scratch kann mehr Probleme verursachen, als es wert ist, wenn Sie interpretierte Sprachen mit starken Umgebungsabhängigkeiten verwenden. Sie müssen Ihr Basis-Image ständig aktualisieren, um auf die neuesten Versionen dieser Pakete zu verweisen. Es ist normalerweise bequemer und wartungsfreundlicher, eine minimale Variante eines vorhandenen Docker Hub-Basisimages zu verwenden.

Zusammenfassung

FROM scratch in einem Dockerfile zeigt an, dass Sie Sie möchten mit einem leeren Dateisystem beginnen, in dem Sie die Kontrolle über jede hinzugefügte Ebene haben. Es ermöglicht hochgradig optimierte Images, bei denen alles außer den Abhängigkeiten bereinigt wird, die Ihre Anwendung benötigt.

Die meisten Entwickler werden Scratch wahrscheinlich nicht direkt verwenden, da es für die meisten Container-Anwendungsfälle ungeeignet ist. Sie können es verwenden, wenn Sie in sich geschlossene statische Binärdateien mit wenigen Umgebungsanforderungen containerisieren möchten.

scratch dient auch als klarer Indikator für den Unterschied zwischen “Containern” und VMs. Ein Image, das nur eine ausführbare Datei enthält, ist ein verwendbarer Docker-Container, da der Prozess auf dem Kernel Ihres Hosts ausgeführt wird. Eine normale VM muss unabhängig von ihrem Host starten, daher muss sie einen vollständigen Betriebssystemkernel in ihrem Image enthalten.