AllInfo

Was ist Dockers BuildKit und warum ist es wichtig?

Docker BuildKit ist eine Opt-in-Image-Building-Engine, die wesentliche Verbesserungen gegenüber das traditionelle Verfahren. BuildKit erstellt parallel Bildebenen und beschleunigt so den gesamten Build-Prozess.

Was ist BuildKit?

BuildKit wurde als Teil des Moby-Projekts entwickelt, einem Docker-Projekt, um “spezielle Containersysteme zusammenzustellen, ohne das Rad neu zu erfinden.” Es wurde 2017 angekündigt und wurde 2018 mit der Docker Engine in der Version 18.09 ausgeliefert.

BuildKit konzentriert sich auf die Verbesserung der Build-Performance, des Speichermanagements und der Erweiterbarkeit. Seine Schlagzeilen sind parallele Verarbeitung, erweitertes Caching, eine austauschbare Architektur und automatische Garbage Collection. Diese kombinieren sich zu einem Build-System, das effizienter und erweiterbarer ist als die ursprüngliche Engine.

Ebenen, die sich nicht gegenseitig beeinflussen, können gleichzeitig erstellt werden, wodurch die Wartezeiten für den Abschluss der Phasen verkürzt werden. BuildKit optimiert auch den Zugriff auf die lokalen Dateien, auf die Sie mit COPY-Anweisungen verweisen. Es verfolgt die von Ihnen vorgenommenen Änderungen und kopiert nur Dateien, die seit dem letzten Build geändert wurden, anstatt den gesamten Build-Kontext zu übertragen.

BuildKit vereinfacht auch plattformübergreifende Builds. Sie können das Flag –platform angeben, um Ziele anzugeben, für die erstellt werden soll. BuildKit stellt automatisch ein geeignetes Image-Manifest zusammen, um alle angegebenen Architekturen abzudecken.

docker buildx –create –platform linux/amd64,linux/arm64 .

Wie funktioniert BuildKit?

Die Leistungsverbesserungen von BuildKit werden durch die Verwendung eines Low-Level-Build-Definitionsformats namens LLB erleichtert. Es handelt sich um ein diagrammbasiertes Binärformat, das komplexe Build-Definitionen verknüpft.

Werbung

Da Ebenen direkt verknüpft sind, ermöglicht BuildKit einen schnelleren Vergleich von Build-Diagrammen und den darin enthaltenen Inhalten. Der standardmäßige Dockerfile-Builder muss sich auf ungenaue Heuristiken verlassen, um festzustellen, ob zwei Images vergleichbar sind.

Das LLB ist vollständig vom BuildKit “Frontend” Das Frontend nimmt eine für Menschen lesbare Darstellung eines Bildes, z. B. ein Dockerfile, und wandelt es in ein LLB-Diagramm um. Sobald eine LLB generiert wurde, kann sie exportiert und zwischen Umgebungen verschoben werden. Durch den Export in eine Registry können Frontend-Clients eine vorhandene LLB erwerben, um die Leistung beim erstmaligen Build weiter zu verbessern.

Die technischen Details der LLB sind ziemlich komplex. Die zugrundeliegende Technologie basiert auf Graphentheorie und Prüfsummenvergleich. Sie müssen es nicht verstehen, um von seiner Leistungsfähigkeit zu profitieren: Als Endbenutzer funktioniert Builds wie immer mit dem Befehl docker build.

BuildKit erstellt weiterhin OCI-kompatible Images, die über verschiedene Containerumgebungen hinweg portierbar sind. Sie können BuildKit verwenden, um ein beliebiges Docker-Image mit einer Linux-Basis zu erstellen. Windows-Images werden derzeit nicht unterstützt.

Aktivieren der BuildKit-Unterstützung

Es gibt zwei Möglichkeiten, BuildKit zu aktivieren. Wenn Sie mit der Funktion ein einzelnes Image erstellen möchten, legen Sie die Umgebungsvariable DOCKER_BUILDKIT in Ihrer Shell fest:

DOCKER_BUILDKIT=1 docker build . Werbung

Konfiguriere den Docker-Daemon für die langfristige Verwendung so, dass er standardmäßig BuildKit verwendet. Erstellen oder bearbeiten Sie die Datei /etc/docker/daemon.json und fügen Sie dem Konfigurationsobjekt der obersten Ebene den folgenden Inhalt hinzu:

{ "features": { "buildkit": true } }

Laden Sie die Daemon-Konfiguration neu, um die Änderung zu übernehmen:

systemctl reload docker

BuildKit wird jetzt anstelle der Standard-Build-Engine verwendet, wenn Sie Führen Sie den Befehl docker build aus.

Sie können erkennen, wann BuildKit aktiv ist, da es eine andere CLI-Ausgabe als die normale Engine erzeugt. Die Fortschrittsanzeige von BuildKit bietet eine verbesserte Lesbarkeit und eine klare Visualisierung, wann jede Phase beginnt und abgeschlossen wird. Die Informationen enthalten eine Aufschlüsselung der Zeit, die zum Erstellen jeder Schicht benötigt wird.

“docker-buildx”

Sie können auch mit BuildKit interagieren durch docker buildx-Befehle. Diese verwenden immer BuildKit. Die dockerx-Befehlsgruppe stellt erweiterte BuildKit-Funktionen bereit, einschließlich der Möglichkeit, auf einem Remote-Host zu erstellen.

Ein einzelner BuildKit-Client kann mit mehreren verschiedenen Image-Builder-Instanzen interagieren. Dies erleichtert plattformübergreifende Builds, indem Sie für jede Architektur, die Sie anvisieren, einen Builder hinzufügen können.

Hier sehen Sie ein Beispiel für das Hinzufügen eines Remote-Hosts als BuildKit-Ziel. Dies setzt voraus, dass der Zielcomputer über einen Docker-Socket auf TCP-Port 2375 verfügt. Sie können auf den Host mit einem beliebigen Docker-Endpunktbezeichner oder dem Namen eines Docker-Kontexts (erhalten aus docker context ls) verweisen. Mit letzterem können Sie auf kompatible Cloud-Umgebungen aufbauen, indem Sie sie als Kontext hinzufügen.

docker buildx create –name remote-builder tcp://my-docker-host:2375 Werbung

Sie können den Builder auswählen, der mit dem Befehl docker buildx use verwendet werden soll:

docker buildx use remote- builder

Dann können Sie den build-Befehl verwenden, um Ihr Image auf der ausgewählten Builder-Instanz zu erstellen:

docker buildx build .

Sie können Builder-Instanzen mit docker buildx rm entfernen, indem Sie den Namen des Builders übergeben. Builder werden mit docker buildx ls aufgelistet; Sie können docker buildx inspect verwenden, um detailliertere Informationen zu einem bestimmten Builder zu erhalten.

Wenn Sie die Festplattennutzung von BuildKit überprüfen möchten, führen Sie den Befehl docker buildx du aus. Sie können den Build-Cache leeren, um mit docker buildx prune Speicherplatz freizugeben. Dies kann die Leistung beim nächsten Neuaufbauen Ihres Images verringern, da zuvor zwischengespeicherte Ebenen rekonstruiert werden.

Build-Features

BuildKit fügt einige zusätzliche Build- Zeitfunktionen, um Ihre Dockerfile-Schritte zu vereinfachen.

Sie können geheime Daten mit dem Flag –secret übergeben. Dadurch kann Ihr Dockerfile auf sensible Werte zugreifen, ohne sie im Image zu speichern. Der Wert ist nur zur Erstellungszeit verfügbar.

docker build –secret id=demo-secret,src=demo-secret.txt . FROM my-image:latest RUN –mount=type=secret,id=demo-secret cat /run/secrets/demo-secrets Werbung

Dieses Dockerfile verweist auf ein Geheimnis namens demo-secret. Sein Wert wird aus der Datei demo-secret.txt gelesen, wenn Sie docker build ausführen. Der RUN-Befehl mit dem Flag –mount bietet Zugriff auf das Geheimnis. Die Datei wird vorübergehend in das Verzeichnis /run/secrets eingehängt.

Mit BuildKit können Sie auch den SSH-Agenten Ihres Hosts weiterleiten, damit Ihre Build-Anweisungen mit bestehenden Remote-Verbindungen interagieren können. Übergeben Sie das Flag –ssh an docker build und fügen Sie –mount=type=ssh zu den RUN-Anweisungen in Ihrem Dockerfile hinzu:

docker build –ssh . RUN –mount=type=ssh git clone git@example.com:/project.git

Diese Funktionen machen das Erstellen von Bildern bequemer, ohne die allgemeine Sicherheit zu beeinträchtigen. SSH-Agent-Weiterleitung und geheime Mounts sind nur in BuildKit verfügbar; Es gibt kein Gegenstück in der Standard-Build-Engine.

Schlussfolgerung

BuildKit ist der Docker-Image-Builder der nächsten Generation, der ein grafisch dargestelltes Binärformat verwendet, um drastisch Builds beschleunigen. Obwohl die Leistung für jedes Dockerfile erheblich variiert, können Sie in Fällen, in denen eine parallele Verarbeitung von Image-Layern möglich ist, mit erheblichen Geschwindigkeitssteigerungen rechnen.

Die Architektur von BuildKit optimiert einige der neuesten Dockerfile-Funktionen. Mehrstufige Builds profitieren vom Überspringen ungenutzter Stufen, was den Prozess effizienter macht als der Standard-Builder.

Obwohl BuildKit jetzt stabil ist, wird Docker immer noch nicht standardmäßig mit ausgeliefert. Stellen Sie sicher, dass Sie es in Ihrem Docker-Client aktivieren, wenn Sie seine Funktionen verwenden möchten. Es gibt einen aktiven Vorschlag, BuildKit zur Standard-Build-Engine zu machen, aber es gibt immer noch ungelöste Probleme, die den Wechsel verhindern.

Exit mobile version