Skip to content

Commit f1a6005

Browse files
committed
feat: dockerfile
1 parent 1552c2f commit f1a6005

1 file changed

Lines changed: 64 additions & 0 deletions

File tree

‎docker/Dockerfile‎

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# ──────────────────────────────────────────────────────────────
2+
# Stage 1 – dependency cache
3+
# Only re-runs when pom.xml changes; Maven deps are cached.
4+
# ──────────────────────────────────────────────────────────────
5+
FROM eclipse-temurin:21-jdk-alpine AS deps
6+
7+
WORKDIR /build
8+
9+
COPY mvnw .
10+
COPY .mvn .mvn
11+
COPY pom.xml .
12+
13+
RUN chmod +x mvnw && \
14+
./mvnw dependency:go-offline -B
15+
16+
# ──────────────────────────────────────────────────────────────
17+
# Stage 2 – compile and package
18+
# Only re-runs when source changes.
19+
# ──────────────────────────────────────────────────────────────
20+
FROM deps AS build
21+
22+
COPY src ./src
23+
24+
RUN ./mvnw clean package -DskipTests -B
25+
26+
# ──────────────────────────────────────────────────────────────
27+
# Stage 3 – extract Spring Boot layers
28+
# Splits the fat JAR into 4 independent Docker layers so that
29+
# library changes don't invalidate the application-code layer.
30+
# ──────────────────────────────────────────────────────────────
31+
FROM eclipse-temurin:21-jdk-alpine AS layers
32+
33+
WORKDIR /build
34+
35+
COPY --from=build /build/target/*.jar app.jar
36+
37+
RUN java -Djarmode=tools -jar app.jar extract \
38+
--layers \
39+
--launcher \
40+
--destination extracted
41+
42+
# ──────────────────────────────────────────────────────────────
43+
# Stage 4 – minimal runtime image (JRE only, no JDK)
44+
# ──────────────────────────────────────────────────────────────
45+
FROM eclipse-temurin:21-jre-alpine AS runtime
46+
47+
RUN addgroup -S appgroup && \
48+
adduser -S appuser -G appgroup
49+
50+
WORKDIR /app
51+
52+
# Most-stable layers first → best Docker cache hit rate
53+
COPY --from=layers /build/extracted/dependencies/ ./
54+
COPY --from=layers /build/extracted/spring-boot-loader/ ./
55+
COPY --from=layers /build/extracted/snapshot-dependencies/ ./
56+
COPY --from=layers /build/extracted/application/ ./
57+
58+
RUN chown -R appuser:appgroup /app
59+
60+
USER appuser
61+
62+
EXPOSE 8080
63+
64+
ENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"]

0 commit comments

Comments
 (0)