File name
Commit message
Commit date
# 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
# 컨테이너 안에서는 스프링 기본 포트를 그대로 쓴다. 바깥 포트는 실행할 때 -p 로 정한다.
EXPOSE 8080
# actuator를 넣지 않아서 헬스체크는 로그인 화면 200으로 확인한다(익명 접근 허용 경로).
HEALTHCHECK --interval=30s --timeout=5s --start-period=90s --retries=3 \
CMD wget -q --spider http://127.0.0.1:8080/login || exit 1
# 컨테이너 메모리 한도에 맞춰 힙을 잡는다.
ENV JAVA_OPTS="-XX:MaxRAMPercentage=75 -XX:+UseContainerSupport"
ENTRYPOINT ["sh", "-c", "exec java $JAVA_OPTS -jar /app/app.jar"]