Skip to content

Commit 3e8ca72

Browse files
author
wlanboy
committed
Refactor Dockerfile to enhance JAR extraction and JRE creation process
1 parent 3d53b3f commit 3e8ca72

1 file changed

Lines changed: 16 additions & 13 deletions

File tree

Dockerfile25Jlink

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@ RUN --mount=type=cache,target=/root/.m2 mvn -q -DskipTests dependency:go-offline
1010
COPY src ./src
1111
RUN --mount=type=cache,target=/root/.m2 mvn -q -DskipTests compile spring-boot:process-aot package
1212

13-
# JAR extrahieren für Layering
14-
RUN cp target/kubeevent-0.0.1-SNAPSHOT.jar app.jar && \
13+
# JAR extrahieren für Layering (Layer gemäß src/main/resources/layers.xml):
14+
# - dependencies, observability-dependencies, spring-boot-loader, snapshot-dependencies, application
15+
# Versionsneutrale Selektion: schließt das Original-JAR (nicht-umgepacktes) aus
16+
RUN JAR=$(ls target/*.jar | grep -v original) && \
17+
cp "$JAR" app.jar && \
1518
java -Djarmode=tools -jar app.jar extract --layers --launcher --destination extracted
1619

1720
# ============================
@@ -58,28 +61,27 @@ RUN $JAVA_HOME/bin/jlink \
5861
--no-man-pages \
5962
--no-header-files \
6063
--compress zip-9 \
61-
--add-options "-XX:+UseZGC -XX:+ExitOnOutOfMemoryError -Dfile.encoding=UTF-8" \
62-
--output /custom-jre
63-
64-
# Erzeuge die Klassenliste für AppCDS
65-
RUN /custom-jre/bin/java -Djarmode=tools -jar app.jar extract --layers --destination cds-extraction
64+
--output /opt/jre
6665

6766
# Erzeugt das Basis-Archiv für das Custom JRE
68-
RUN /custom-jre/bin/java -Xshare:dump
67+
# WICHTIG: -XX:+UseZGC muss hier angegeben werden! ZGC nutzt Colored Pointers (andere Heap-Struktur als G1GC).
68+
# Das CDS-Archiv wird mit dieser Heap-Konfiguration erstellt. Wenn zur Laufzeit ein anderer GC
69+
# aktiv ist, lehnt die JVM das Archiv mit "Loading static archive failed" ab.
70+
RUN /opt/jre/bin/java -XX:+UseZGC -Xshare:dump
6971

7072
# CDS Archiv generieren
7173
# 1. Liste der Klassen erstellen (Training)
7274
# WICHTIG: Wir nutzen /custom-jre/bin/java, damit das Archiv zum JRE passt!
7375
# spring.context.exit weist Spring Boot an, den Application Context aufzubauen (damit alle Klassen geladen werden),
7476
# aber die App sofort danach sauber zu beenden
7577
# Training gegen die entpackten Layer (muss identisch zum Start sein!)
76-
RUN /custom-jre/bin/java -XX:ArchiveClassesAtExit=app.jsa \
78+
RUN /opt/jre/bin/java -XX:+UseZGC -XX:ArchiveClassesAtExit=app.jsa \
7779
-Dspring.context.exit=onRefresh \
7880
-Dspring.aot.enabled=true \
7981
-cp "extracted/dependencies/*:extracted/observability-dependencies/*:extracted/snapshot-dependencies/*:extracted/application/" \
8082
org.springframework.boot.loader.launch.JarLauncher || [ -f app.jsa ]
81-
# Hinweis: Das "|| true" ist wichtig, da die App beim Training mangels DB/Config evtl. abbricht,
82-
# aber das Archiv trotzdem schreibt.
83+
# Hinweis: Das "|| [ -f app.jsa ]" ist wichtig, da die App beim Training mangels DB/Config evtl. abbricht,
84+
# aber das Archiv trotzdem schreibt. Der Exit-Code 1 ist nur akzeptabel, wenn app.jsa existiert.
8385

8486
# ============================
8587
# 3. Runtime Stage (Minimales OS)
@@ -92,8 +94,8 @@ LABEL org.opencontainers.image.title="Java kubernetes event client with Custom J
9294

9395
WORKDIR /app
9496

95-
# Kopiere das Custom JRE aus der Build-Stage
96-
COPY --from=build /custom-jre /opt/jre
97+
# Kopiere das Custom JRE aus der Build-Stage (wurde direkt nach /opt/jre gebaut)
98+
COPY --from=build /opt/jre /opt/jre
9799
ENV PATH="/opt/jre/bin:$PATH"
98100

99101
USER nonroot
@@ -120,6 +122,7 @@ ENTRYPOINT [ \
120122
"-XX:InitialRAMPercentage=40", \
121123
"-XX:+UseZGC", \
122124
"-XX:+ExitOnOutOfMemoryError", \
125+
"-Dfile.encoding=UTF-8", \
123126
"org.springframework.boot.loader.launch.JarLauncher", \
124127
"--spring.config.location=file:/app/config/application.properties" \
125128
]

0 commit comments

Comments
 (0)