# ITN-HUB 컨테이너 이미지. # # 1단계에서 프런트(React)까지 함께 빌드한다 - frontend-maven-plugin이 Node v20.17.0을 # 내려받아 `npm run build`를 돌리고, 그 결과가 src/main/resources/static 으로 들어가 # 단일 jar에 패키징된다. 따라서 빌드 머신에 JDK/Node를 따로 깔 필요가 없고, # 대신 <빌드할 때> 인터넷(nodejs.org, npm registry, Maven Central)이 열려 있어야 한다. # # 테스트는 여기서 돌리지 않는다(-DskipTests). Testcontainers가 Docker를 다시 필요로 해서 # 이미지 빌드 안에서 돌리면 Docker-in-Docker가 되기 때문이다. 테스트는 CI에서 별도 단계로 돌린다. FROM maven:3.9-eclipse-temurin-21 AS build WORKDIR /build # pom을 먼저 넣어 의존성 레이어를 캐시한다(소스만 바뀌면 이 레이어는 재사용된다). COPY pom.xml ./ RUN mvn -B -q dependency:go-offline -DskipTests || true COPY . . RUN mvn -B -DskipTests package \ && cp target/itnhub-*.jar /build/app.jar FROM eclipse-temurin:21-jre-alpine # 한국 시간대. 이걸 안 넣으면 컨테이너가 UTC로 돌아서 업무단계 도달 일시, 카드의 D+n, # 연락 이력 날짜가 9시간 어긋난다. RUN apk add --no-cache tzdata \ && cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime \ && echo "Asia/Seoul" > /etc/timezone ENV TZ=Asia/Seoul # 루트로 돌리지 않는다. RUN addgroup -S itnhub && adduser -S -G itnhub itnhub USER itnhub WORKDIR /app COPY --from=build /build/app.jar /app/app.jar # 컨테이너 안에서도 앱 기본 포트(8877)를 그대로 쓴다. 바깥 포트는 실행할 때 -p 로 정한다. EXPOSE 8877 # actuator를 넣지 않아서 헬스체크는 로그인 화면 200으로 확인한다(익명 접근 허용 경로). HEALTHCHECK --interval=30s --timeout=5s --start-period=90s --retries=3 \ CMD wget -q --spider http://127.0.0.1:8877/login || exit 1 # 컨테이너 메모리 한도에 맞춰 힙을 잡는다. ENV JAVA_OPTS="-XX:MaxRAMPercentage=75 -XX:+UseContainerSupport" ENTRYPOINT ["sh", "-c", "exec java $JAVA_OPTS -jar /app/app.jar"]