Repository navigation
Expand file tree
/
Copy pathDockerfile
More file actions
45 lines (37 loc) · 2.15 KB
/
Copy pathDockerfile
File metadata and controls
45 lines (37 loc) · 2.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# ────────────────────────────────────────────
# Stage 1: builder — Gradle 로 JAR 빌드
# ────────────────────────────────────────────
FROM eclipse-temurin:25-jdk AS builder
WORKDIR /workspace
# 의존성 레이어만 먼저 복사해서 캐시 활용
COPY gradlew .
COPY gradle gradle
COPY build.gradle.kts .
COPY settings.gradle.kts .
RUN ./gradlew dependencies --no-daemon
# 소스 복사 후 빌드
COPY src src
RUN ./gradlew bootJar --no-daemon
# ────────────────────────────────────────────
# Stage 2: extractor — Layered JAR 분리
# ────────────────────────────────────────────
FROM eclipse-temurin:25-jdk AS extractor
WORKDIR /workspace
COPY --from=builder /workspace/build/libs/*.jar app.jar
# --launcher 가 없으면 아래 ENTRYPOINT 의 JarLauncher 가 아니라 java -jar 용 구조로 풀린다.
RUN java -Djarmode=tools -jar app.jar extract --layers --launcher --destination extracted
# ────────────────────────────────────────────
# Stage 3: runtime — 최소 실행 이미지
# ────────────────────────────────────────────
FROM eclipse-temurin:25-jre AS runtime
WORKDIR /app
# non-root 유저 생성
RUN groupadd --system appgroup && useradd --system --gid appgroup appuser
# 레이어 순서대로 복사 (변경 빈도 낮은 것 → 높은 것)
COPY --from=extractor /workspace/extracted/dependencies/ ./
COPY --from=extractor /workspace/extracted/spring-boot-loader/ ./
COPY --from=extractor /workspace/extracted/snapshot-dependencies/ ./
COPY --from=extractor /workspace/extracted/application/ ./
USER appuser
# 리슨 포트는 배포가 env PORT 로 넘긴다.
ENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"]