모듈을 분리(예: payment-service)해도 로컬/서버에서 Docker 빌드·배포·모니터링이 문제없이 동 작하도록 표준 설정을 정리합니다.
멀티 모듈 프로젝트는 Gradle이 settings.gradle.kts에 정의된 모든 모듈 디렉터리를 확인함. 따라서 dependencies/build 전에 모듈 디렉터리를 최소한 복사해야 함.
# Build stage
FROM eclipse-temurin:21-jdk-jammy AS build
WORKDIR /app
# Gradle 캐시용 파일
COPY gradlew .
COPY gradle gradle
COPY build.gradle.kts .
COPY settings.gradle.kts .
**# 모듈 build.gradle.kts를 먼저 복사해야 dependencies 단계가 실패하지 않음
COPY payment-service/build.gradle.kts payment-service/build.gradle.kts**
RUN chmod +x ./gradlew
RUN ./gradlew dependencies --no-daemon
# 소스 복사
COPY src src
COPY payment-service payment-service
RUN ./gradlew build -x test --no-daemon
# Run stage
FROM eclipse-temurin:21-jre-jammy
WORKDIR /app
COPY --from=build /app/build/libs/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
모듈별로 독립 이미지 빌드용 Dockerfile 생성
# Build stage
FROM eclipse-temurin:21-jdk-jammy AS build
WORKDIR /app
# Gradle 전체 프로젝트를 복사하여 빌드 컨텍스트를 맞춥니다.
COPY . .
# 실행 권한을 부여하고 'payment-service' 모듈만 bootJar로 빌드합니다.
RUN chmod +x ./gradlew
RUN ./gradlew :payment-service:bootJar --no-daemon
# Run stage
FROM eclipse-temurin:21-jre-jammy
WORKDIR /app
# build 스테이지에서 빌드된 payment-service의 JAR 파일만 복사합니다.
COPY --from=build /app/payment-service/build/libs/payment-service-*.jar app.jar
# 애플리케이션 포트 노출 (docker-compose에서 설정할 포트와 맞춤)
EXPOSE 8082
# 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "app.jar"]
모듈 서비스는 build 대신 image만 사용해야 함 (서버에서 build 하지 않기 위해).