Maven-Projekte schneller in Docker erstellen

Maven-Projekte schneller in Docker erstellen

I. Überblick

In 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:

  • Konventioneller mehrstufiger Imageaufbau
  • Erstellen von Images mit Buildkit
  • Erstellen von Images mithilfe geschichteter Abhängigkeiten
  • Verwenden von Volume-Mounts während Buildkit-Builds
  • Erstellen von Images mit dem Maven-Daemon

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:

* 0,36 s Benutzer 0,53 s System 0 % CPU 1:53,06 gesamt
* 0,36 s Benutzer 0,56 s System 0 % CPU 1:52,50 gesamt
* 0,35 s Benutzer 0,55 s System 0 % CPU 1:56,92 gesamt
* 0,36 s Benutzer 0,56 s System 0 % CPU 2:04,55 gesamt
* 0,38 s Benutzer 0,61 s System 0 % CPU 2:04,68 gesamt

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:

  • Automatische Speicherbereinigung
  • Gleichzeitige Abhängigkeitsauflösung
  • Effizienter Befehlscache
  • Build-Cache-Import/-Export
  • usw.

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:

...
=> => Kontext übertragen: 4,35 kB
=> [Build 2/6] KOPIEREN .mvn .mvn
=> [Build 3/6] KOPIEREN Sie mvnw.
=> [Build 4/6] KOPIEREN Sie pom.xml.
=> [Build 5/6] KOPIEREN Quelle Quelle
=> [Build 6/6] RUN ./mvnw -B Paket
...

0,68 s Benutzer 1,04 s System 1 % CPU 2:06,33 gesamt

Die folgenden Ausführungen desselben Befehls haben leicht unterschiedliche Ausgaben:

...
=> =>Kontext übertragen: 1,82 kB
=> CACHED [Build 2/6] KOPIEREN .mvn .mvn
=> CACHED [Build 3/6] KOPIE mvnw.
=> CACHED [Build 4/6] KOPIEREN von pom.xml.
=> [Build 5/6] KOPIEREN Quelle Quelle
=> [Build 6/6] RUN ./mvnw -B Paket
...

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.

* 0,69 s Benutzer, 1,01 s System, 1 % CPU, 2:05,08 gesamt
* 0,65 s Benutzer, 0,95 s System, 1 % CPU, 1:58,51 gesamt
* 0,68 s Benutzer 0,99 s System 1 % CPU 1:59,31 gesamt
* 0,64 s Benutzer, 0,95 s System, 1 % CPU, 1:59,82 gesamt

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ängigkeitsschichtung

Wir sollten uns auf Abhängigkeiten konzentrieren. Dazu können wir Ebenen verwenden und den Aufbau in zwei Schritte aufteilen:

  • Der erste Schritt besteht darin, Abhängigkeiten herunterzuladen
  • Im zweiten Schritt kümmern wir uns um die richtige Verpackung

Jeder Schritt erstellt eine Ebene und die zweite hängt von der ersten ab.
Durch die Schichtung wird die erste Schicht nicht beeinträchtigt und kann wiederverwendet werden, wenn wir den Quellcode in der zweiten Schicht ändern. Wir müssen Abhängigkeiten nicht erneut herunterladen. Das neue Dockerfile sieht folgendermaßen aus:

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:

* 0,23 s Benutzer 0,36 s System 5 % CPU 9,913 gesamt
* 0,21 s Benutzer 0,33 s System 5 % CPU 9,923 gesamt
* 0,22 s Benutzer 0,38 s System 6 % CPU 9,990 gesamt
* 0,21 s Benutzer 0,34 s System 5 % CPU 9,814 gesamt
* 0,22 s Benutzer 0,37 s System 5 % CPU 10.454 gesamt

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.
Verwenden Sie den folgenden Befehl, um das Image zu erstellen:

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:

* 0,22 s Benutzer 0,33 s System 5 % CPU 9,677 gesamt
* 0,30 s Benutzer 0,36 s System 6 % CPU 10.603 gesamt
* 0,24 s Benutzer 0,37 s System 5 % CPU 10.461 gesamt
* 0,24 s Benutzer 0,39 s System 6 % CPU 10,178 gesamt
* 0,24 s Benutzer 0,35 s System 5 % CPU 10.283 gesamt

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:

* 0,70 s Benutzer, 1,01 s System, 1 % CPU, 1:51,96 gesamt
* 0,72 s Benutzer 0,98 s System 1 % CPU 1:47,93 gesamt
* 0,66 s Benutzer 0,93 s System 1 % CPU 1:46,07 gesamt
* 0,76 s Benutzer, 1,04 s System, 1 % CPU, 1:50,35 gesamt
* 0,80 s Benutzer, 1,18 s System, 1 % CPU, 2:01,45 gesamt

Es gibt keine wesentliche Verbesserung gegenüber regulären Build-Images.

VII. Fazit

Hier noch einmal eine Übersicht aller Ausführungszeiten:

Ausgangslage Toolkit erstellen Schichten Datenträgermontage MVND
#1 (S) 113,06 125,08 155,47 110,5 111,96
#2 (S) 112,5 118,51 9,91 9,68 107,93
#3 (S) 116,92 119,31 9,92 10.6 106.07
#4 (S) 124,55 119,82 9,99 10.46 110,35
#5 (S) 124,68 9,81 10.18 121,45
#6 (S) 10.45 10.28
#7 (S) 44,71
Durchschnitt (Sekunden) 118,34 120,68 9,91 10.24 111,55
Abweichung 28,55 6,67 0,01 0,10 111,47
Basisgewinn(S) 0 -2,34 108,43 108.10 6,79
% erhalten 0,00 % -1,98 % 91,63 % 91,35 % 5,74 %

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.
Für BuildKit wird empfohlen, die neue Cache-Mount-Funktion zu verwenden, um das Herunterladen aller Abhängigkeiten zu vermeiden, wenn eine Ebene ungültig wird.

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:
  • Docker erstellt eine Jenkins+Maven-Plattform zum Erstellen und Bereitstellen von Code
  • Implementierungsschritte des Maven-Plugins zum Erstellen eines Docker-Images
  • Implementierung des Docker-Buildings für Maven+Tomcat-Basisimages
  • So verwenden Sie das Maven-Plugin zum Erstellen von Bildern in Docker
  • Eine kurze Erläuterung zum Erstellen von Docker-Images mit Maven-Plugins

<<:  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

Artikel empfehlen

js zur Realisierung einer einfachen Warenkorbfunktion

In diesem Artikelbeispiel wird der spezifische Co...

jQuery implementiert Navigationsleisteneffekt mit Erweiterungsanimation

Ich habe eine Navigationsleiste mit einem erweite...

Berechtigungen für Cross-Origin-Image-Ressourcen (CORS-fähiges Image)

Das HTML-Spezifikationsdokument führt das Crossor...

Parsen des Linux-Quellcodes epoll

Inhaltsverzeichnis 1. Einleitung 2. Einfaches Epo...

Analysieren Sie mehrere gängige Lösungen für MySQL-Ausnahmen

Inhaltsverzeichnis Vorwort 1. Der vom Code konfig...

jQuery-Plugin zum Erzielen eines Karusselleffekts

Jeden Tag ein jQuery-Plugin - jQuery-Plugin zur I...

So richten Sie Textfelder in mehreren Formularen in HTML aus

Der Formularcode ist wie in der Abbildung dargest...

MySQL-Import- und Export-Sicherungsdetails

Inhaltsverzeichnis 1. Detaillierte Erklärung der ...

Wie verstecke ich einen bestimmten Text in HTML?

Code zum Ausblenden von Text, Ausblenden eines bes...

Detaillierte Erläuterung der MySQL sql_mode-Abfrage und -Einstellung

1. Führen Sie SQL aus, um anzuzeigen wählen Sie @...

So stellen Sie mit Navicat eine Remoteverbindung zur Cloud-Server-Datenbank her

Es ist sehr praktisch, eine Verbindung zu einer R...

Detaillierte Erläuterung des MySQL-Indexprinzips und der Abfrageoptimierung

Inhaltsverzeichnis 1. Einleitung 1. Was ist ein I...