|
| 1 | +FROM public.ecr.aws/docker/library/maven:3-amazoncorretto-25-al2023 AS builder |
| 2 | + |
| 3 | +COPY ./pom.xml ./pom.xml |
| 4 | +COPY src ./src/ |
| 5 | + |
| 6 | +RUN mvn clean package -DskipTests -ntp \ |
| 7 | + -Dspring-boot.aot.enabled=true && \ |
| 8 | + mv target/store-spring-1.0.0-exec.jar app.jar |
| 9 | + |
| 10 | +FROM public.ecr.aws/docker/library/amazoncorretto:25-al2023 AS trainer |
| 11 | + |
| 12 | +COPY --from=builder app.jar app.jar |
| 13 | + |
| 14 | +# Explode fat jar for AOT training |
| 15 | +RUN mkdir -p /ex && (cd /ex && jar -xf /app.jar) && \ |
| 16 | + mkdir -p /opt/app/training /opt/app/lib && \ |
| 17 | + (cd /ex/BOOT-INF/classes && jar -cf /opt/app/training/classes.jar .) && \ |
| 18 | + cp -r /ex/BOOT-INF/lib/* /opt/app/lib/ |
| 19 | + |
| 20 | +# Create sorted classpath for deterministic ordering between training and runtime |
| 21 | +RUN ls /opt/app/lib/*.jar | sort | tr '\n' ':' | sed 's/:$//' > /opt/app/lib-cp.txt |
| 22 | + |
| 23 | +ENV MAIN_CLASS="com.unicorn.store.StoreApplication" |
| 24 | + |
| 25 | +# Optional: pass DB props for training to capture Hibernate/JDBC classes |
| 26 | +# docker build --build-arg TRAINING_JAVA_OPTS="-Dspring.datasource.url=... -Dspring.datasource.username=... -Dspring.datasource.password=..." ... |
| 27 | +ARG TRAINING_JAVA_OPTS="" |
| 28 | +ENV TRAINING_JAVA_OPTS=${TRAINING_JAVA_OPTS} |
| 29 | +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" |
| 30 | + |
| 31 | +# Record AOT configuration |
| 32 | +RUN set -e; \ |
| 33 | + OPTS="${TRAINING_JAVA_OPTS}"; [ -z "${OPTS}" ] && OPTS="${TRAINING_JAVA_OPTS_DEFAULT}"; \ |
| 34 | + java -XX:AOTMode=record -XX:AOTConfiguration=/app.aotconf \ |
| 35 | + -cp "/opt/app/training/classes.jar:$(cat /opt/app/lib-cp.txt)" \ |
| 36 | + -Dspring.context.exit=onRefresh ${OPTS} ${MAIN_CLASS} || true && \ |
| 37 | + test -s /app.aotconf |
| 38 | + |
| 39 | +# Create AOT cache |
| 40 | +RUN set -e; \ |
| 41 | + OPTS="${TRAINING_JAVA_OPTS}"; [ -z "${OPTS}" ] && OPTS="${TRAINING_JAVA_OPTS_DEFAULT}"; \ |
| 42 | + java -XX:AOTMode=create -XX:AOTConfiguration=/app.aotconf \ |
| 43 | + -XX:AOTCache=/opt/app/app.aot \ |
| 44 | + -cp "/opt/app/training/classes.jar:$(cat /opt/app/lib-cp.txt)" \ |
| 45 | + ${OPTS} ${MAIN_CLASS} || true && \ |
| 46 | + test -s /opt/app/app.aot |
| 47 | + |
| 48 | +FROM public.ecr.aws/docker/library/amazoncorretto:25-al2023 |
| 49 | + |
| 50 | +RUN yum install -y shadow-utils |
| 51 | + |
| 52 | +COPY --from=trainer /opt/app/training/classes.jar /opt/app/training/classes.jar |
| 53 | +COPY --from=trainer /opt/app/lib/ /opt/app/lib/ |
| 54 | +COPY --from=trainer /opt/app/app.aot /opt/app/app.aot |
| 55 | +COPY --from=trainer /opt/app/lib-cp.txt /opt/app/lib-cp.txt |
| 56 | + |
| 57 | +RUN groupadd --system spring -g 1000 |
| 58 | +RUN adduser spring -u 1000 -g 1000 |
| 59 | + |
| 60 | +USER 1000:1000 |
| 61 | +EXPOSE 8080 |
| 62 | + |
| 63 | +ENTRYPOINT ["sh", "-c", "exec java -XX:AOTCache=/opt/app/app.aot -Dserver.port=8080 -cp /opt/app/training/classes.jar:$(cat /opt/app/lib-cp.txt) com.unicorn.store.StoreApplication"] |
0 commit comments