Die Docker-Image-Erstellungszeit für die Spring Boot-Anwendung betrug mehr als 5 Minuten. Aus diesem Grund dauert das Erstellen und Bereitstellen in der Inspektionsumgebung einige Zeit. Es gab ein Problem, bei dem das Ausprobieren einige Zeit in Anspruch nahm, was nur in der Inspektionsumgebung möglich ist.
Sample Dockerfile
FROM openjdk:11.0.8-jre-slim as builder
WORKDIR /app
# build.Fügen Sie nur Dateien hinzu, die von gradle abhängen.
#Leerlaufgradle-Build zum Zwischenspeichern abhängiger Dateien
COPY *.gradle gradle.* gradlew /app/
COPY gradle/ /app/gradle/
RUN ./gradlew build -x test --parallel --continue > /dev/null 2>&1 || true
#Integrieren und erstellen Sie Codeänderungen nach den folgenden Zeilen
COPY . /app
RUN ./gradlew build -x test --parallel
FROM openjdk:11.0.8-jre-slim
COPY --from=builder /app/build/libs/app.jar /app/app.jar
CMD ["java", "-jar", "/app/app.jar"]
Tipps: Mehrstufige Builds werden verwendet, um den Build-Container und den Ausführungscontainer zu trennen.
Ich denke, dass die Docker-Datei, die einen gemeinsamen Gradle-Build ausführt, wie folgt lautet.
FROM openjdk:11.0.8-jre-slim as builder
WORKDIR /app
COPY . /app
RUN ./gradlew build -x test --parallel
Das Problem mit dieser Docker-Datei ist, dass das Erstellen sehr lange dauert, da die Gradle-Binärdateien und abhängigen Dateien bei jedem Erstellen heruntergeladen werden. Dieses Mal werden wir den Download dieser binären und abhängigen Gradle-Dateien in der Bildebene zwischenspeichern.
Leider gibt es keine Gradle-Befehle, die nur Binärdateien und abhängige Dateien herunterladen. Der Download erfolgt jedoch zu Beginn des Build-Laufs. Selbst wenn der Build fehlschlägt, wird der Pre-Download daher im Leerlauf durchgeführt.
$ ./gradlew build --continue > /dev/null 2>&1 || true
Durch Hinzufügen der Option "--continue" kann sogar ein Build mit mehreren Projekten bis zum Ende ausgeführt und die abhängigen Dateien heruntergeladen werden.
Der Befehl COPY
prüft anhand der Prüfsumme der Datei, ob der Cache verwendet werden kann.
(* Es ist nicht das Datum der letzten Aktualisierung oder das Datum und die Uhrzeit des Zugriffs.)
Daher können Sie eine Ebene erstellen, in der die abhängigen Dateien von COPY
heruntergeladen werden. Dies sind die minimal erforderlichen Dateien für Gradle Build und Idle Build.
Da build.gradle
usw. selten geändert werden, kann der Cache bei vielen Builds verwendet und die Build-Zeit reduziert werden.
COPY *.gradle gradle.* gradlew /app/
COPY gradle/ /app/gradle/
Mithilfe des oben genannten Gradle-abhängigen Dateicaches können Sie die Erstellungszeit für Docker-Images reduzieren. Der Reduktionseffekt hängt von der Umgebung und dem Java-Projekt ab, aber ich werde mein Anwendungsergebnis weitergeben.
Vor der Anwendung: 4min 56sec
Nach der Anwendung: "1min 42sec"
Durch Anwendung dieser Methode konnten wir die Bauzeit um ca. 70% reduzieren.
Wir hoffen, dass die oben beschriebene Methode die Image-Erstellungszeit von Docker mit Gradle in der Welt so weit wie möglich verkürzt. Wenn Sie Fehler in der Beschreibung finden, teilen Sie uns dies bitte in den Kommentaren mit.