Good Spring Boot Dockerfiles
Here's Dockerfiles I currently use to package Spring Boot applications in a docker container.
This one for spring-boot version 3.3 or greater:
FROM eclipse-temurin:21 AS builder
WORKDIR /opt/build
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=tools -jar application.jar extract --layers --destination extracted
FROM eclipse-temurin:21-jre
WORKDIR /opt/app
COPY --from=builder /opt/build/extracted/dependencies/ ./
COPY --from=builder /opt/build/extracted/spring-boot-loader/ ./
COPY --from=builder /opt/build/extracted/snapshot-dependencies/ ./
COPY --from=builder /opt/build/extracted/application/ ./
# Execute the CDS training run
# See: https://docs.spring.io/spring-boot/reference/packaging/container-images/dockerfiles.html#packaging.container-images.dockerfiles.cds
RUN java -XX:ArchiveClassesAtExit=application.jsa \
-Dspring.context.exit=onRefresh \
-Dspring.profiles.active=cds \
-jar application.jar \
&& rm -rf /tmp/tomcat*
CMD ["java", "-XX:SharedArchiveFile=application.jsa", "-jar", "application.jar"]
This one for spring-boot version 2.3 or greater
FROM eclipse-temurin:21 AS builder
WORKDIR /opt/build
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract
FROM eclipse-temurin:21-jre
WORKDIR app
COPY --from=builder /opt/build/dependencies/ ./
COPY --from=builder /opt/build/spring-boot-loader/ ./
COPY --from=builder /opt/build/snapshot-dependencies/ ./
COPY --from=builder /opt/build/application/ ./
# This will work for version 3 and above
CMD ["java", "org.springframework.boot.loader.JarLauncher"]
# This will work for versions below 3
# CMD ["java", "org.springframework.boot.JarLauncher"]
Resulting images are layered neatly and efficiently, while also optimized for startup time.
Feel free use and to tweak them for your needs.