# 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"]