-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathDockerfile.template
More file actions
78 lines (59 loc) · 2.54 KB
/
Dockerfile.template
File metadata and controls
78 lines (59 loc) · 2.54 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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# Stage 1: Build
FROM amazoncorretto:21-alpine AS builder
WORKDIR /app
# Gradle Wrapper 복사 및 실행 권한 부여
COPY gradlew .
RUN chmod +x gradlew
COPY gradle gradle
# 빌드 파일 먼저 복사 (캐시 활용)
COPY build.gradle settings.gradle ./
# 의존성 다운로드 (실패해도 괜찮음 - 어차피 bootJar에서 다시 다운로드)
RUN ./gradlew dependencies --no-daemon --quiet 2>/dev/null || true
# 모든 서비스 복사
COPY user-service user-service
COPY order-service order-service
COPY payment-service payment-service
COPY product-service product-service
COPY queue-service queue-service
COPY timedeal-service timedeal-service
COPY auth-service auth-service
# gateway, discovery는 제외 (AWS API Gateway, ECS Service Discovery 사용)
# auth-service는 JWT 발급용으로 필요
# 특정 서비스만 빌드 (ARG로 전달받음)
ARG SERVICE_NAME
RUN ./gradlew :${SERVICE_NAME}:bootJar --no-daemon
# Stage 2: Runtime
FROM amazoncorretto:21-alpine
# wget 설치 (헬스체크용) + 타임존 설정
RUN apk add --no-cache wget tzdata && \
cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \
echo "Asia/Seoul" > /etc/timezone && \
apk del tzdata
# 비 root 유저로 실행 (보안)
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
# 빌드된 JAR 복사
ARG SERVICE_NAME
COPY --from=builder --chown=appuser:appgroup /app/${SERVICE_NAME}/build/libs/*.jar app.jar
# appuser로 전환 (이 시점부터 모든 작업은 appuser 권한)
USER appuser
# 서버 포트를 환경 변수로 받음 (기본값 8080)
ENV SERVER_PORT=8080 \
SPRING_PROFILES_ACTIVE=prod
# Actuator 헬스체크 (동적 포트 사용)
# 주의: HEALTHCHECK의 CMD-SHELL은 환경변수 확장이 안되므로 포트를 하드코딩하거나
# ECS Task Definition에서 별도로 healthCheck를 정의해야 함 (아래는 로컬에서 테스트용.. 실제로는 override됨)
HEALTHCHECK --interval=30s --timeout=5s --start-period=60s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/actuator/health || exit 1
# 포트 노출 (문서화 목적)
EXPOSE ${SERVER_PORT}
# JVM 메모리 최적화 옵션
ENV JAVA_OPTS="-XX:+UseContainerSupport \
-XX:MaxRAMPercentage=75.0 \
-XX:InitialRAMPercentage=50.0 \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+UnlockExperimentalVMOptions \
-XX:+UseStringDeduplication"
# 애플리케이션 실행 (배열 형식 - exec form)
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]