1+ # syntax=docker/dockerfile:1
2+ # ===== build (Spring AOT + package) =====
3+ FROM public.ecr.aws/docker/library/maven:3-amazoncorretto-25-al2023 AS build
4+ WORKDIR /w
5+ COPY pom.xml .
6+ COPY src ./src/
7+ RUN mvn -DskipTests clean compile org.springframework.boot:spring-boot-maven-plugin:process-aot package \
8+ && mv target/*-exec.jar /w/app.jar \
9+ && rm -rf ~/.m2/repository
10+
11+ # ===== train (Leyden AOT cache) =====
12+ FROM public.ecr.aws/docker/library/amazoncorretto:25-al2023 AS train
13+ WORKDIR /w
14+ COPY --from=build /w/app.jar /w/app.jar
15+ # explode fat jar and make a JAR-only classpath that matches final runtime paths
16+ RUN mkdir -p /w/ex && (cd /w/ex && jar -xf /w/app.jar) \
17+ && mkdir -p /opt/app/training /opt/app/lib \
18+ && (cd /w/ex/BOOT-INF/classes && jar -cf /opt/app/training/classes.jar .) \
19+ && cp -r /w/ex/BOOT-INF/lib/* /opt/app/lib/
20+ ENV APP_CP="/opt/app/training/classes.jar:/opt/app/lib/*"
21+ ENV MAIN_CLASS="com.unicorn.store.StoreApplication"
22+ # Optional: pass DB props for training in one shot
23+ # docker build --build-arg TRAINING_JAVA_OPTS="-Dspring.datasource.url=... -Dspring.datasource.username=... -Dspring.datasource.password=... -Dspring.sql.init.mode=never" ...
24+ ARG TRAINING_JAVA_OPTS=""
25+ ENV TRAINING_JAVA_OPTS=${TRAINING_JAVA_OPTS}
26+ ENV TRAINING_JAVA_OPTS_DEFAULT="-Dspring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration -Dspring.main.lazy-initialization=true"
27+
28+ # record
29+ RUN set -e; \
30+ OPTS="$TRAINING_JAVA_OPTS"; [ -z "$OPTS" ] && OPTS="$TRAINING_JAVA_OPTS_DEFAULT"; \
31+ java -XX:AOTMode=record -XX:AOTConfiguration=/w/app.aotconf \
32+ -cp "$APP_CP" -Dspring.context.exit=onRefresh $OPTS $MAIN_CLASS || true \
33+ && test -s /w/app.aotconf
34+
35+ # create cache
36+ RUN set -e; \
37+ OPTS="$TRAINING_JAVA_OPTS"; [ -z "$OPTS" ] && OPTS="$TRAINING_JAVA_OPTS_DEFAULT"; \
38+ java -XX:AOTMode=create -XX:AOTConfiguration=/w/app.aotconf \
39+ -XX:AOTCache=/opt/app/app.aot \
40+ -cp "$APP_CP" $OPTS $MAIN_CLASS || true \
41+ && test -s /opt/app/app.aot
42+
43+ # ===== runtime =====
44+ FROM public.ecr.aws/docker/library/amazoncorretto:25-al2023
45+ RUN yum install -y shadow-utils
46+ WORKDIR /opt/app
47+ COPY --from=train /opt/app/training/classes.jar /opt/app/training/classes.jar
48+ COPY --from=train /opt/app/lib/ /opt/app/lib/
49+ COPY --from=train /opt/app/app.aot /opt/app/app.aot
50+ RUN groupadd --system spring -g 1000
51+ RUN adduser spring -u 1000 -g 1000
52+ USER 1000:1000
53+ EXPOSE 8080
54+ ENTRYPOINT ["java", "-XX:AOTCache=/opt/app/app.aot", "-cp", "/opt/app/training/classes.jar:/opt/app/lib/*", "com.unicorn.store.StoreApplication"]
0 commit comments