# EP38: Dockerfile — Multi-stage build
#
# Stage 1(builder): JDK + Gradle로 jar를 빌드한다.
# Stage 2(runner) : JRE만 포함한 경량 이미지에 jar만 복사해 실행한다.
#   - 최종 이미지에 빌드 도구/소스코드가 남지 않아 이미지 용량(약 200MB)과
#     공격 표면을 함께 줄인다.

# ── Stage 1: Build ──
FROM eclipse-temurin:21-jdk AS builder
WORKDIR /app

# Gradle 의존성 레이어 캐시 최적화: 의존성 정의 파일을 소스보다 먼저 복사
COPY gradlew settings.gradle build.gradle ./
COPY gradle ./gradle
# EP47: gradlew는 실행 권한이 없는 상태로 체크아웃될 수 있다 (Permission denied 에러 방지)
RUN chmod +x gradlew
RUN ./gradlew dependencies --no-daemon

# 소스 빌드 (테스트는 CI에서 별도로 실행하므로 -x test)
COPY src ./src
RUN ./gradlew bootJar -x test --no-daemon

# ── Stage 2: Run ──
FROM eclipse-temurin:21-jre
WORKDIR /app

# 컨테이너 내부에서 root가 아닌 전용 사용자로 실행 (보안 권장사항)
RUN addgroup --system appgroup \
    && adduser --system --ingroup appgroup appuser

COPY --from=builder /app/build/libs/*.jar app.jar
USER appuser

EXPOSE 8080

# EP36 Actuator의 /actuator/health를 컨테이너 자체 헬스체크로 활용
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \
    CMD wget -qO- http://localhost:8080/actuator/health | grep -q '"status":"UP"' || exit 1

ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-jar", "app.jar"]
