Dia's code

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.

#Docker #Dockerfile #Spring Boot