Einführung in Docker BuildKit

Blog

Ich arbeite als SRE und ein Großteil meiner Arbeit dreht sich um Docker-Container. Und ein Großteil der Arbeit rund um Docker-Container besteht darin, sie zu bauen. Einige Dockerfiles sind wirklich einfach, zum Beispiel beim Hinzufügen einer Go-Binärdatei zu einem Alpine/Scratch-Image, während andere komplizierter sind, insbesondere wenn mehrstufige Builds verwendet werden. In den späteren Fällen erstellen Sie normalerweise neben den Images auch Ihre Binärdateien mit Docker. Und manchmal kann das Ausführen dieser Docker-Build-Befehle in solchen Fällen mehr als ein paar Minuten dauern (z Argo-CD dauert etwa 12–15 Minuten, wobei nicht nur ein Bild erstellt wird).

Bild für Beitrag

Ab Docker 18.09 gibt es eine neue Methode zum Erstellen von Images namens BuildKit . Dies gilt als V2 von Docker Build und ist derzeit nicht einmal für Docker 19.03 der Standardweg, Sie müssen es aktivieren. Der einfachste Weg, es zu aktivieren, besteht darin, eine Umgebungsvariable zu setzen: DOCKER_BUILKIT = 1 . Diese V2 fügt viele interessante Funktionen hinzu und einige davon sind sofort einsatzbereit. Auch das resultierende Docker-Image ähnelt denen, die mit dem normalen Build erstellt wurden, sodass es keine Probleme geben sollte, dieses Image auszuführen oder in eine Registrierung zu verschieben.

BuildKit-Leistungsverbesserungen

Beim normalen Docker-Build wird jede Schicht nacheinander erstellt, Sie müssen warten, bis Schicht n n+1 erstellt. Diese Einschränkung war anfangs nicht sehr sichtbar, aber mit der Einführung von mehrstufigen Builds wurde es zu einem größeren Problem, da Sie mehrere Schritte parallel starten können, bis sie voneinander abhängig sind. Durch die Einführung von Parallelität kann hier also wertvolle Zeit gewonnen werden.

Um herauszufinden, welche Schritte parallel gebaut werden können und welche aufeinander warten müssen, erstellt BuildKit ein Diagramm der Abhängigkeiten und verwendet es, um die Build-Effizienz zu erhöhen. Die Ausgabe eines docker build-Befehls unterscheidet sich völlig von der, die Sie bisher verwendet haben, mit einigen Schritten, die parallel ausgeführt werden, ähnlich wie unten (wo Sie sehen können, dass #4 parallel zu #10 läuft):

#2 [internal] load build definition from Dockerfile #2 transferring dockerfile: 1.15kB done #2 DONE 0.0s #1 [internal] load .dockerignore #1 transferring context: 2B done #1 DONE 0.0s #3 [internal] load metadata for docker.io/library/openjdk:8 #3 DONE 1.7s #4 [1/8] FROM docker.io/library/openjdk:8@sha256:291ef47999c4ee7160cc1208ff... #4 resolve docker.io/library/openjdk:8@sha256:291ef47999c4ee7160cc1208ff49244bf93a43b7eca1c31842615fc529efc24e done #4 ... #10 [internal] load build context #10 transferring context: 10.60kB done #10 DONE 0.0s #4 [1/8] FROM docker.io/library/openjdk:8@sha256:291ef47999c4ee7160cc1208ff...

Die Leistung ist nicht die einzige Verbesserung, die BuildKit liefert, aber wir können es ohne Änderungen am Dockerfile sofort einsatzbereit haben. Und das möchte ich als nächstes überprüfen, wie man BuildKit bei mehrstufigen Docker-Builds aktiviert und ob es wirklich eine spürbare Verbesserung ist.

#docker #devops

itnext.io

Einführung in Docker BuildKit

Docker Build ist eine der am häufigsten verwendeten Funktionen der Docker Engine. Docker Build, das BuildKit integriert, sollten Benutzer eine Verbesserung der Leistung, des Speichermanagements, der Funktionsfunktionen und der Sicherheit feststellen. Mit BuildKit erstellte Docker-Images können auf Docker Hub übertragen werden, genau wie Docker-Images, die mit Legacy-Build erstellt wurden