1+ # ====================================
2+ # Dockerfile for API Module
3+ # ====================================
4+
5+ # Stage 1: Build
6+ FROM gradle:8.5-jdk17-alpine AS builder
7+
8+ # 빌드 인자 선언 (docker-compose.prod.yml에서 전달)
9+ ARG BUILD_DATE
10+ ARG VCS_REF
11+ ARG VERSION
12+
13+ WORKDIR /app
14+
15+ # 루트 프로젝트 설정 파일 복사
16+ #COPY settings.gradle ./
17+ #COPY build.gradle ./
18+ #COPY gradlew ./
19+ #COPY gradle gradle/
20+
21+ COPY settings.gradle ./
22+ COPY build.gradle ./
23+ COPY gradlew ./
24+ COPY gradle gradle/
25+ COPY monew-monitor/build.gradle monew-monitor/
26+
27+ # 2) CRLF 제거 + 실행권한 + 존재 확인
28+ RUN sed -i 's/\r$//' gradlew && chmod +x gradlew && \
29+ ls -al && ls -al gradle/wrapper && head -n1 gradlew && \
30+ ./gradlew --version
31+
32+ # 모든 서브모듈의 build.gradle 복사 (의존성 캐싱)
33+ COPY monew-api/build.gradle monew-api/build.gradle
34+ COPY monew-batch/build.gradle monew-batch/build.gradle
35+ COPY monew-monitor/build.gradle monew-monitor/build.gradle
36+
37+ # Gradle wrapper 실행 권한
38+ RUN chmod +x gradlew || true
39+
40+ # 의존성 다운로드 (캐시 레이어)
41+ RUN ./gradlew dependencies --no-daemon || true
42+
43+ # API 모듈 소스 코드 복사
44+ COPY monew-api/ monew-api/
45+
46+ # API 모듈만 빌드 (테스트 제외)
47+ RUN ./gradlew :monew-api:bootJar -x test --no-daemon
48+
49+ # JAR 파일 위치 확인 및 복사
50+ RUN mkdir -p /app/build && \
51+ find monew-api/build/libs -name "*.jar" -not -name "*-plain.jar" -exec cp {} /app/build/app.jar \;
52+
53+ # Stage 2: Runtime
54+ FROM eclipse-temurin:17-jre-alpine
55+
56+ # 빌드 인자 다시 선언 (runtime stage에서 사용)
57+ ARG BUILD_DATE
58+ ARG VCS_REF
59+ ARG VERSION
60+
61+ WORKDIR /app
62+
63+ # 이미지 메타데이터 레이블 추가
64+ LABEL org.opencontainers.image.created="${BUILD_DATE}" \
65+ org.opencontainers.image.revision="${VCS_REF}" \
66+ org.opencontainers.image.version="${VERSION}" \
67+ org.opencontainers.image.title="Monew API" \
68+ org.opencontainers.image.description="Monew API Server"
69+
70+ # 보안을 위한 non-root 사용자 생성
71+ RUN addgroup -S spring && adduser -S spring -G spring
72+
73+ # 타임존 설정
74+ RUN apk add --no-cache tzdata wget && \
75+ cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \
76+ echo "Asia/Seoul" > /etc/timezone && \
77+ apk del tzdata
78+
79+ # 빌드 스테이지에서 JAR 파일 복사
80+ COPY --from=builder /app/build/app.jar app.jar
81+
82+ # 로그 디렉토리 생성 및 권한 설정
83+ RUN mkdir -p /app/.logs && chown -R spring:spring /app/.logs
84+
85+ # 소유권 변경
86+ RUN chown spring:spring app.jar
87+
88+ # 사용자 변경
89+ USER spring:spring
90+
91+ # 헬스체크 설정
92+ HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \
93+ CMD wget --no-verbose --tries=1 --spider http://localhost:8080/actuator/health || exit 1
94+
95+ # JVM 옵션 설정 (환경변수로 오버라이드 가능)
96+ ENV JAVA_OPTS="-XX:+UseContainerSupport \
97+ -XX:MaxRAMPercentage=75.0 \
98+ -XX:InitialRAMPercentage=50.0 \
99+ -XX:+UseG1GC \
100+ -XX:+OptimizeStringConcat \
101+ -Djava.security.egd=file:/dev/./urandom"
102+
103+ # 애플리케이션 포트
104+ EXPOSE 8080
105+
106+ # 애플리케이션 실행
107+ ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
0 commit comments