Setting the file. One moment.
Skill 114 · Create Spring Boot Java Project
Subchapter 114.10
assets/Dockerfile-gradle
DOCKERFILE-GRADLE56 lines2 KB
# syntax=docker/dockerfile:1
#
# Multi-stage JVM image for a Spring Boot Gradle project (Groovy or Kotlin DSL).
# Gradle counterpart of ./Dockerfile; the toolchain in the build must match the JDK of the build stage.
# Adapted from jdubois/dr-jskill (Apache-2.0); see references/PROVENANCE.md.
#
# - The Boot jar is exploded into layers and started with the JarLauncher.
# - A minimal runtime is assembled with jlink.
# - The runtime image is distroless (no shell, non-root, uid 65532).
# JVM flags go through JAVA_TOOL_OPTIONS because there is no shell.
#
# docker build -f Dockerfile-gradle -t my-spring-app .
# docker run --rm -p 8080:8080 my-spring-app
FROM eclipse-temurin:25-jdk-noble AS build
WORKDIR /app
COPY gradlew .
COPY gradle gradle
COPY settings.gradle* build.gradle* ./
RUN chmod +x gradlew && ./gradlew --no-daemon dependencies > /dev/null
COPY src ./src
RUN ./gradlew --no-daemon bootJar -x test
# bootJar also leaves a *-plain.jar next to the executable jar: skip it.
RUN cp "$(ls build/libs/*.jar | grep -v -- '-plain\.jar$' | head -1)" app.jar && \
java -Djarmode=tools -jar app.jar extract --layers --launcher --destination extracted
# Module list suits typical web + JPA apps; run `jdeps --print-module-deps` if the app fails with NoClassDefFoundError.
RUN "$JAVA_HOME/bin/jlink" \
--add-modules java.base,java.logging,java.naming,java.management,java.management.rmi,java.instrument,java.sql,java.sql.rowset,java.transaction.xa,java.xml,java.xml.crypto,java.desktop,java.security.jgss,java.security.sasl,java.scripting,java.compiler,java.net.http,java.rmi,java.prefs,jdk.unsupported,jdk.crypto.ec,jdk.crypto.cryptoki,jdk.jfr,jdk.management,jdk.management.agent,jdk.attach,jdk.zipfs,jdk.charsets,jdk.net,jdk.security.auth \
--strip-debug --no-man-pages --no-header-files --compress=zip-6 \
--output /javaruntime
FROM gcr.io/distroless/base-debian12:nonroot
ENV JAVA_HOME=/opt/java
ENV PATH="$JAVA_HOME/bin:$PATH"
COPY --from=build /javaruntime $JAVA_HOME
WORKDIR /app
COPY --from=build --chown=65532:65532 /app/extracted/dependencies/ ./
COPY --from=build --chown=65532:65532 /app/extracted/spring-boot-loader/ ./
COPY --from=build --chown=65532:65532 /app/extracted/snapshot-dependencies/ ./
COPY --from=build --chown=65532:65532 /app/extracted/application/ ./
USER nonroot
ENV JAVA_TOOL_OPTIONS="-XX:MaxRAMPercentage=75.0 -XX:+ExitOnOutOfMemoryError"
EXPOSE 8080
ENTRYPOINT ["/opt/java/bin/java", "org.springframework.boot.loader.launch.JarLauncher"]