Optimierung mehrstufiger Dockerfiles für Java EE-Apps
Beim Erstellen von Java EE-Anwendungen mit mehrstufigen Dockerfiles gibt es verschiedene Optimierungsmethoden, um die Größe des endgültigen Docker-Images zu reduzieren und den Build-Prozess zu verbessern.
Nutzung von Build-Abhängigkeiten
Eine gängige Optimierung besteht darin, Build-Abhängigkeiten nur in der Build-Phase zu verwenden und sie von der endgültigen Laufzeitphase auszuschließen. Sie können beispielsweise ein separates Build-Image verwenden, das alle notwendigen Build-Tools wie ein Maven- oder Gradle-Image enthält, und dann die erstellten Artefakte in ein kleineres Laufzeit-Image kopieren.
## Build-Phase
FROM maven:3.8.2-openjdk-11 AS build
COPY . /app
WORKDIR /app
RUN mvn clean package
## Laufzeit-Phase
FROM openjdk:11-jdk-slim
COPY --from=build /app/target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
Verwendung des mehrstufigen Cache
Die mehrstufige Build-Funktion von Docker ermöglicht es Ihnen auch, den Build-Cache zu nutzen, um nachfolgende Builds zu beschleunigen. Durch eine Organisation Ihres Dockerfiles, die die Wiederverwendung des Cache maximiert, können Sie die Build-Zeit deutlich reduzieren.
## Basis-Phase
FROM maven:3.8.2-openjdk-11 AS base
WORKDIR /app
## Abhängigkeiten kopieren
COPY pom.xml .
RUN mvn dependency:go-offline
## Build-Phase
FROM base AS build
COPY . .
RUN mvn clean package
## Laufzeit-Phase
FROM openjdk:11-jdk-slim
COPY --from=build /app/target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
In diesem Beispiel wird die Datei pom.xml
kopiert und die Abhängigkeiten in der Basis-Phase heruntergeladen. Dadurch wird sichergestellt, dass der Schritt der Abhängigkeitsauflösung im Cache gespeichert wird, was nachfolgende Builds beschleunigt.
Optimierung des Laufzeit-Images
Eine weitere Optimierungsmethode besteht darin, ein kleineres Basis-Image für die Laufzeitphase zu verwenden. Sie können beispielsweise das openjdk:11-jdk-slim
-Image anstelle des vollständigen openjdk:11-jdk
-Images verwenden, was die Größe des endgültigen Images erheblich reduzieren kann.
## Laufzeit-Phase
FROM openjdk:11-jdk-slim
COPY --from=build /app/target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
Zusätzlich können Sie Techniken wie mehrstufige Builds, Alpine-basierte Images oder distroless-Images verwenden, um die Größe des Laufzeit-Images weiter zu optimieren.
Durch die Anwendung dieser Optimierungsmethoden können Sie hochoptimierte Docker-Images für Ihre Java EE-Anwendungen erstellen, die die Imagegröße reduzieren und den Build-Prozess verbessern.