For Maven users, the ultimate Dockerfile
is below.
FROM openjdk:8-jdk-alpine as build WORKDIR /workspace/app COPY mvnw . COPY .mvn .mvn COPY pom.xml . RUN ./mvnw dependency:go-offline COPY src src RUN ./mvnw package -DskipTests RUN mkdir -p target/dependency && (cd target/dependency; jar -xf ../*.jar) FROM openjdk:8-jre-alpine VOLUME /tmp ARG DEPENDENCY=/workspace/app/target/dependency COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app ENTRYPOINT ["java","-cp","app:app/lib/*","FULL_NAME_OF_SPRING_BOOT_MAIN_CLASS"]
Please make sure to update FULL_NAME_OF_SPRING_BOOT_MAIN_CLASS
with Spring Boot application main class.
For Gradle users, the ultimate Dockerfile
is below.
FROM openjdk:8-jdk-alpine as build WORKDIR /workspace/app COPY gradlew . COPY gradle gradle COPY build.gradle . RUN ./gradlew dependencies COPY src src RUN ./gradlew build unpack -x test RUN mkdir -p build/dependency && (cd build/dependency; jar -xf ../libs/*.jar) FROM openjdk:8-jre-alpine VOLUME /tmp ARG DEPENDENCY=/workspace/app/build/dependency COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app ENTRYPOINT ["java","-cp","app:app/lib/*","FULL_NAME_OF_SPRING_BOOT_MAIN_CLASS"]
Please make sure to update FULL_NAME_OF_SPRING_BOOT_MAIN_CLASS
with Spring Boot application main class.
You can watch this video to learn more about optimizing docker images for Spring Boot applications.