I. ÜberblickIn diesem Artikel werden Docker-Images auf die folgenden Arten erstellt und die Erstellungszeit jeder Methode aufgezeichnet, um den schnellsten Weg zum Erstellen von Maven-Projekten in Docker zu finden:
Zwischen jedem Durchlauf ändern wir den Quellcode, indem wir eine Leerzeile hinzufügen. Zwischen jedem Teil löschen wir alle erstellten Bilder, einschließlich Zwischenbilder als Ergebnis mehrstufiger Builds, um die Wiederverwendung zuvor erstellter Bilder zu vermeiden und genauere Build-Zeiten für jede Methode zu erhalten. Unten finden Sie ein einfaches Spring-Boot-Projekt zum Testen. 2. Konventioneller mehrstufiger Imageaufbau Hier ist das entsprechende Dockerfile: VON openjdk:11-slim-buster als Build KOPIEREN .mvn .mvn KOPIEREN Sie mvnw. KOPIEREN SIE pom.xml. KOPIEREN src src RUN ./mvnw -B Paket VON openjdk:11-jre-slim-buster KOPIEREN --from=Buildziel/fast-maven-builds-1.0.jar. EXPOSE 8080 EINSTIEGSPUNKT ["java", "-jar", "fast-maven-builds-1.0.jar"] Lassen Sie uns den Build ausführen: Zeit DOCKER_BUILDKIT=0 Dockerbuild -t Fast-Maven:1.0. Vergessen Sie vorerst die Umgebungsvariablen. Ich werde sie im nächsten Abschnitt erklären. Hier sind die Ergebnisse aus fünf Läufen:
3. Verwenden Sie Buildkit zum Erstellen von Bildern Die vorherige Befehlszeile verwendet die Umgebungsvariable DOCKER_BUILDKIT, mit der Sie Docker anweisen, die alte Engine zu verwenden. Wenn Sie Docker eine Weile nicht aktualisiert haben, ist dies die Engine, die Sie verwenden. Heute wurde es durch BuildKit als neuen Standard ersetzt. BuildKit bringt mehrere Leistungsverbesserungen:
Lassen Sie uns den vorherigen Befehl auf der neuen Engine erneut ausführen: Zeit Docker Build -t Fast-Maven:1.1. Hier ein Auszug aus dem Konsolenprotokoll des ersten Durchlaufs:
Die folgenden Ausführungen desselben Befehls haben leicht unterschiedliche Ausgaben:
Denken Sie daran, dass wir den Quellcode zwischen den Läufen geändert haben. Die Dateien, die wir nicht ändern, nämlich .mvn, mvnw und pom.xml, werden von BuildKit zwischengespeichert. Da diese Ressourcen jedoch klein sind, werden sich die Build-Zeiten durch das Caching nicht wesentlich verbessern.
Ein kurzer Blick auf die Protokolle zeigte, dass der größte Engpass beim Build der Download aller Abhängigkeiten (einschließlich Plugins) war. Dies geschieht jedes Mal, wenn wir eine Änderung am Quellcode vornehmen, weshalb BuildKit die Leistung nicht verbessert. 4. Erstellen Sie Bilder mithilfe der AbhängigkeitsschichtungWir sollten uns auf Abhängigkeiten konzentrieren. Dazu können wir Ebenen verwenden und den Aufbau in zwei Schritte aufteilen:
Jeder Schritt erstellt eine Ebene und die zweite hängt von der ersten ab. VON openjdk:11-slim-buster als Build KOPIEREN .mvn .mvn KOPIEREN Sie mvnw. KOPIEREN SIE pom.xml. RUN ./mvnw -B Abhängigkeit: offline gehen KOPIEREN src src RUN ./mvnw -B Paket VON openjdk:11-jre-slim-buster KOPIEREN --from=Buildziel/fast-maven-builds-1.2.jar. EXPOSE 8080 EINSTIEGSPUNKT ["java", "-jar", "fast-maven-builds-1.2.jar"] HINWEIS: Beim Offlineschalten wird nicht alles heruntergeladen. Wenn Sie versuchen, die Option -o (für offline) zu verwenden, wird der Befehl nicht erfolgreich ausgeführt. Dies ist ein alter und bekannter Fehler. In allen Fällen ist es „gut genug“. Lassen Sie uns den Build ausführen: Zeit Docker Build -t Fast-Maven:1.2. Der erste Durchlauf dauert viel länger als ein regulärer Build: 0,84 s Benutzer 1,21 s System 1 % CPU 2:35,47 gesamt Nachfolgende Builds sind jedoch viel schneller. Das Ändern des Quellcodes betrifft nur die zweite Ebene und löst nicht den Download (der meisten) Abhängigkeiten aus:
5. Verwenden von Volume-Mounts während Buildkit-Builds Layer-Builds verkürzen die Build-Zeit erheblich, aber es gibt immer noch ein Problem. Das Ändern einer einzelnen Abhängigkeit macht die Ebene ungültig, von der das Image abhängt. Daher müssen wir alle Abhängigkeiten erneut herunterladen. Glücklicherweise führt BuildKit die Volume-Montage während der Build-Zeit ein (nicht nur während der Laufzeit). Es stehen mehrere Mount-Typen zur Verfügung, für uns ist jedoch der Cache-Mount von Interesse. Dies ist eine experimentelle Funktion, Sie müssen sich daher ausdrücklich dafür entscheiden: Das Dockerfile sieht folgendermaßen aus: # syntax=docker/dockerfile:experimentell VON openjdk:11-slim-buster als Build KOPIEREN .mvn .mvn KOPIEREN Sie mvnw. KOPIEREN SIE pom.xml. KOPIEREN src src # Cache zum Erstellen verwenden RUN --mount=type=cache,target=/root/.m2,rw ./mvnw -B package VON openjdk:11-jre-slim-buster KOPIEREN --from=Buildziel/fast-maven-builds-1.3.jar. EXPOSE 8080 EINSTIEGSPUNKT ["java", "-jar", "fast-maven-builds-1.3.jar"] Die # Syntax=docker/dockerfile:experimental wird verwendet, um experimentelle Funktionen zu aktivieren. Zeit Docker Build -t Fast-Maven:1.3. Die Build-Zeiten sind höher als bei regulären Builds, aber immer noch niedriger als bei geschichteten Builds: 0,71 s Benutzer 1,01 s System 1 % CPU 1:50,50 gesamt Die folgenden Konstrukte entsprechen Ebenen:
6. Erstellen von Images mit dem Maven-Daemon Der Inhalt der Dockerfile-Datei zum Erstellen eines Images mit dem Maven-Daemon lautet wie folgt: VON openjdk:11-slim-buster als Build # Laden Sie die neueste Version des Maven-Daemons ADD herunter: https://github.com/mvndaemon/mvnd/releases/download/0.6.0/mvnd-0.6.0-linux-amd64.zip . # Paketindex aktualisieren RUN apt-get update \ # Installieren und entpacken && apt-get install unzip \ # Erstellen Sie einen dedizierten Ordner && mkdir /opt/mvnd \ # Extrahieren Sie die zuvor heruntergeladene MVND-Datei && entpacken Sie mvnd-0.6.0-linux-amd64.zip \ # Verschieben Sie den extrahierten Archivinhalt in den zuvor erstellten Ordner && mv mvnd-0.6.0-linux-amd64/* /opt/mvnd KOPIEREN .mvn .mvn KOPIEREN Sie mvnw. KOPIEREN SIE pom.xml. KOPIEREN src src # Verwenden Sie mvnd anstelle des Maven-Wrappers RUN /opt/mvnd/bin/mvnd -B package VON openjdk:11-jre-slim-buster KOPIEREN --from=Buildziel/fast-maven-builds-1.4.jar. EXPOSE 8080 EINSTIEGSPUNKT ["java", "-jar", "fast-maven-builds-1.4.jar"] Erstellen Sie das Image mit dem folgenden Befehl: Zeit Docker Build -t Fast-Maven:1.4. Die Protokollausgabe lautet wie folgt:
Es gibt keine wesentliche Verbesserung gegenüber regulären Build-Images. VII. FazitHier noch einmal eine Übersicht aller Ausführungszeiten:
Die Leistungsbeschleunigung von Maven-Builds in Docker unterscheidet sich stark von regulären Builds. Der begrenzende Faktor ist die Downloadgeschwindigkeit der Abhängigkeiten und zum Zwischenspeichern der Abhängigkeiten ist die Verwendung von Ebenen erforderlich. Verweise https://blog.frankel.ch/faster-maven-builds/2/ Dies ist das Ende dieses Artikels zum schnelleren Erstellen von Maven-Projekten in Docker. Weitere Informationen zum Erstellen von Maven-Projekten mit Docker finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: Mehrere Möglichkeiten zum Planen der Sicherung einer MySQL-Datenbank (umfassend)
>>: Heute bin ich auf ein sehr seltsames Problem gestoßen und habe es selbst gelöst
In diesem Artikelbeispiel wird der spezifische Co...
1 Anforderungen im Überblick Die Daten mehrerer T...
Ich habe eine Navigationsleiste mit einem erweite...
Das HTML-Spezifikationsdokument führt das Crossor...
Docker-Funktionen 1) Schneller Einstieg Benutzer ...
Inhaltsverzeichnis 1. Einleitung 2. Einfaches Epo...
Inhaltsverzeichnis Vorwort 1. Der vom Code konfig...
Jeden Tag ein jQuery-Plugin - jQuery-Plugin zur I...
Der Formularcode ist wie in der Abbildung dargest...
Inhaltsverzeichnis 1. Detaillierte Erklärung der ...
Code zum Ausblenden von Text, Ausblenden eines bes...
1. Führen Sie SQL aus, um anzuzeigen wählen Sie @...
Es ist sehr praktisch, eine Verbindung zu einer R...
Um zu verhindern, dass nicht konforme Daten in di...
Inhaltsverzeichnis 1. Einleitung 1. Was ist ein I...