# syntax=docker/dockerfile:1
# =============================================================================
# bibimbap 멀티스테이지 빌드 (JDK 21)
#   stage build : Maven 으로 WAR 패키징. dev 프로필 필수(-P dev) — 미지정 시
#                 application.properties 의 @app.profile@ 필터링이 적용되지 않아
#                 spring.profiles.active 가 리터럴 '@app.profile@' 로 깨진다.
#                 spring-boot 3.5.14-SNAPSHOT 라 빌드에 spring-snapshots 저장소
#                 (repo.spring.io/snapshot) 네트워크 접근이 필요하다(오프라인 빌드 불가).
#   stage run   : 재패키징된 실행형 WAR 를 임베디드 Tomcat 으로 기동(JSP 렌더 가능).
# =============================================================================

FROM maven:3.9-eclipse-temurin-21 AS build
WORKDIR /build
# 회사 TLS 인터셉션 프록시(예: Cloudflare Gateway) 환경 대응:
#   certs/*.crt|*.pem 를 컨테이너 JDK truststore 에 주입한다. 없으면(프록시 없는 환경) skip.
#   미주입 시 repo.spring.io/snapshot 에서 PKIX path building failed 로 SNAPSHOT 빌드가 깨진다.
COPY certs/ /tmp/certs/
RUN for c in /tmp/certs/*.crt /tmp/certs/*.pem; do \
        [ -f "$c" ] || continue; \
        echo "importing proxy CA into cacerts: $c"; \
        keytool -importcert -noprompt -trustcacerts -cacerts -storepass changeit \
            -alias "proxy-ca-$(basename "$c")" -file "$c"; \
    done
COPY pom.xml .
COPY src ./src
# 테스트는 빌드 단계에서 제외(이 단계엔 DB 가 없다). 테스트는 호스트(Path B) 또는 별도 단계에서 수행.
# spring-boot:repackage 를 명시 호출한다. 이 pom 은 spring-boot-starter-parent 를 쓰지 않고
# dependencyManagement import 만 하므로 repackage goal 이 package phase 에 자동 바인딩되지 않는다.
# 명시하지 않으면 일반(비실행) WAR 가 나와 'no main manifest attribute' 로 java -jar 가 실패한다.
RUN mvn -B -P dev clean package spring-boot:repackage -DskipTests

FROM eclipse-temurin:21-jre
WORKDIR /app
# 재패키징된 실행형 WAR (artifactId-version.war). 임베디드 Tomcat 포함.
COPY --from=build /build/target/*.war /app/app.war
EXPOSE 8080
# 데이터소스/업로드 경로는 런타임에 환경변수로 주입된다(이미지에 비밀값 비포함).
ENTRYPOINT ["java", "-jar", "/app/app.war"]
