[JAVA] Cache Gradle-abhängige Dateien, um die Docker-Erstellung zu beschleunigen

Abstrakt

Motivation

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.

Ausführliche Erklärung

Allgemeines Dockerfile-Beispiel

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.

Es gibt keinen Befehl zum Herunterladen abhängiger Dateien in Gradle

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.

Cache-Eigenschaften des Befehls "COPY"

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/

Reduktionseffekt

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.

Schließlich

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.

Recommended Posts

Cache Gradle-abhängige Dateien, um die Docker-Erstellung zu beschleunigen
So erstellen Sie eine Docker-Umgebung mit Gradle for IntelliJ
Richten Sie in IntelliJ ein Gradle-Multiprojekt ein, um eine JAR-Datei zu erstellen
[Rails] So beschleunigen Sie das Docker-Compose
So erstellen Sie CloudStack mit Docker
Aktivieren Sie den Build-Cache von Docker in GitHub Action und stellen Sie ihn auf Amazon ECS bereit
So teilen Sie Dateien mit Docker Toolbox
Erstellen Sie mit Gradle ein Spring Boot + Docker-Image
[Docker] Kopieren Sie Dateien aus dem Docker-Container auf den Host
Docker Container Build kann PHP-Radis nicht installieren
So erstellen Sie eine Rails 6-Umgebung mit Docker
Kopieren Sie Dateien vom Docker-Container auf den Host (Docker-CP).
Erstellen Sie Java x Spring x VSCode x Gradle auf Docker (1)
So aktualisieren Sie eine vorgefertigte Datei in einem Docker-Container
[Rails] So erstellen Sie eine Umgebung mit Docker
So erstellen Sie Parkett-Tools und führen Parkett-Dateien zusammen