Schritt für Schritt zum „Chiselled Ubuntu“-Basis-Image Ultraleichtes Ubuntu selbstgemacht

Ein Gastbeitrag von Valentin Viennot * 3 min Lesedauer

Wie sich ein Ubuntu-Image um das 15-fache verkleinern lässt, haben wir schon erfahren. In einer Schritt-für-Schritt-Anleitung wollen wir nun betrachten, wie man sein Ubuntu-Basis-Image für jeden Anwendungsfall anpassen kann.

So sehen Chiselled Ubuntu containers aus – zumindest nach Auffassung der generativen KI DALL-E2.
So sehen Chiselled Ubuntu containers aus – zumindest nach Auffassung der generativen KI DALL-E2.
(Bild: Dall-E 2)

Ein perfektes Container-Basis-Image wird es vielleicht nie geben. Anfangs schien mir Googles Distroless-Basis ziemlich nah an dieser Vorstellung zu sein. In der Praxis hat sich aber gezeigt, dass man diesem Ziel am nächsten kommt, wenn man das Basis-Image tatsächlich von Grund auf neu erstellt.

Ein Base Image soll nur genau das enthalten, was man benötigt und von einer gut gewarteten und unterstützten Linux-Distribution aus installiert werden. Hier ist die Anleitung für das eigene, auf Ubuntu aufbauende Basis-Container-Image.

Schritt 1: Chiselled Ubuntu mit Docker bauen

Um „chiselled Ubuntu“-Images zu erstellen, benötigen wir zunächst einen „Meißel“, also ein Werkzeug zum Bearbeiten. Das Chisel-Paket-Slicing-Tool, das zum Erstellen von Ubuntu-Basis-Images verwendet wird, ist eine Go-Anwendung. Allerdings gibt es dafür derzeit keine vorgefertigten Versionen. Daher müssen sie mit dem Golang-SDK gebaut werden.

Das für die weitere Arbeit benötigte, Ubuntu-basierte Chisel-OCI-Image.
Das für die weitere Arbeit benötigte, Ubuntu-basierte Chisel-OCI-Image.
(Bild: Viennot / Canonical)

Bei GitHub habe ich eine 20-zeilige Docker-Datei bereitgestellt, die zeigt, wie man Chisel baut und als Container-Image mit Docker, dem Go SDK und dem Chisel selbst verpackt. Nach der Erstellung ist das Ergebnis ein weniger als 16 MB großes, auf Ubuntu basierendes Chisel-Image. Das endgültige Chisel-OCI-Image enthält eine angepasste Ubuntu-Basis (hauptsächlich Glibc und CA-Zertifikate) und das mit Go kompilierte Chisel-Tool, das in unseren zukünftigen Container-Builds verwendet werden kann.

Schritt 2: Ubuntu selbst gemacht

Um sein eigenes Chiselled-Ubuntu-Basis-Image zu erstellen, beginnt man mit einem von Grunde neu gebauten Image und fügt die notwendigen Chiselled-Ubuntu-Bits aus den ausgewählten Paketabhängigkeiten hinzu.

Inspiriert von Googles Distroless-Basis-Image habe ich für dieses Beispiel die folgenden Paket-Slices aus der Ubuntu-Distribution gewählt: base-files_base, base-files_release-info, ca-certificates_data, and libc6_libs.

Dafür folgt man am besten dieser Anweisung in fünf Schritten aus dieser Docker-Datei:

# chiselled-base.dockerfile# "chisel:22.04" ist unser früheres "chisel" Image von Schritt 1
# gebaut und lokal mit dem Tag des Docker CLI versehen
FROM chisel:22.04 als Installer
WORKDIR /staging
# Schneiden Sie mit einem Chisel die erforderlichen Paketscheiben aus dem
# chisel:22.04 Image und speichern Sie diese im /staging directory
RUN ["chisel", "cut", "--root", "/staging", \
   "base-files_base", \
   "base-files_release-info", \
   "ca-certificates_data", \
   "libc6_libs" ]
# Beginnen Sie mit einem Scratch-Image als Basis für unser chiselled Ubuntu-Basis-Image
FROM scratch
# Kopieren Sie die Paket-Slices aus dem Installations-Image
# in das Verzeichnis / unseres Ubuntu-Basisimages
COPY --from=installer [ "/staging/", "/" ]

Sobald Sie diese Docker-Datei erstellt haben, können Sie ihr eigenes neues Chiselled Ubuntu Image mit dieser Kommandozeile bauen:

docker build . -t chiselled-base:22.04 -f chiselled-base.dockerfile

Das persönliche Basis-Image ist gerade einmal 5 MB klein.
Das persönliche Basis-Image ist gerade einmal 5 MB klein.
(Bild: Viennot / Canonical)

Das angepasste chiselled Ubuntu-Basis-Image sollte etwa 5 MB groß sein und ist bereit, viele C/C++-, Golang- oder andere dynamisch verlinkte, in sich geschlossene Programme auszuführen. Mit der mitgelieferten beispielhaften Dockerdatei, die ein C-Programm über das neue Basis-Image legt, lässt es sich testen.

Schritt 3: SSL-Support für das Basis-Image hinzufügen

Wenn die Anwendung SSL-Unterstützung benötigt, lässt sich diese ganz einfach zu Ihrem Ubuntu-Basis-Image hinzufügen, indem Sie die folgenden Zeilen zur eigenen vorherigen Docker-Datei hinzufügen:

# chiselled-ssl-base.dockerfile# " chisel:22.04" ist unser vorheriges "chisel"-Image aus Schritt 1
# Wir haben es lokal mit dem Docker CLI gebaut und markiert.
FROM chisel:22.04 als Installer
WORKDIR /staging
RUN ["chisel", "cut", "--root", "/staging", \
   "base-files_base", \
   "base-files_release-info", \
   "ca-certificates_data", \
   "libc6_libs", \
   "libssl3_libs", \
   "openssl_config" ]
FROM scratch
COPY --from=installer [ "/staging/", "/" ]

Zum Erstellen eines neuen Ubuntu-Basis-Image mit SSL-Unterstützung verwendet man den Befehl:

docker build . -t chiselled-ssl-base:22.04 -f chiselled-ssl-base.dockerfile

Ein Base-Image für den Einsatz in Anwendungen, die SSL erfordern.
Ein Base-Image für den Einsatz in Anwendungen, die SSL erfordern.
(Bild: Viennot / Canonical)

Ihr neues Basis-Image mit SSL-Unterstützung sollte weniger als 11 MB groß sein. Mit diesem einfachen Verfahren können Sie problemlos Paketabhängigkeiten hinzufügen und entfernen und Ihr chiselled Ubuntu-Basis-Image an spezifische Bedürfnisse und Anforderungen anpassen. Weitere Beispiele und Anwendungsfälle, einschließlich der Erstellung zusätzlicher Paket-Slices, finden sich im weiter unten gelisteten Git-Repository für Beispiele.

Fazit

Chiselled Ubuntu Container-Images kombinieren die Vorteile einer bekannten und gut gewarteten Linux-Distribution mit den Vorteilen ultrakleiner Container-Images vom Typ Distroless. Letztere liefern eine sichere und effiziente Grundlage für die Entwicklung und Bereitstellung von containerisierten Anwendungen.

Warum also nicht einmal chiselled Ubuntu-Container-Images ausprobieren und sich von den Vorteilen überzeugen? „Probieren geht über Studieren“ – oder in diesem Fall die Größe Ihres Container-Images!

Artikelfiles und Artikellinks

(ID:49540295)

Jetzt Newsletter abonnieren

Täglich die wichtigsten Infos zu Softwareentwicklung und DevOps

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung.

Aufklappen für Details zu Ihrer Einwilligung