Docker 를 활용해 각 서비스 모듈을 빌드하고 배포하는 CI/CD 파이프라인을 구축하던 중 멀티 모듈 프로젝트에서의 Docker 관련 문제를 겪었습니다.
Docker 빌드 컨텍스트에서 모듈 참조 문제
멀티모듈 구조의 프로젝트에서 각 서비스 모듈이 공통 모듈(예: common, security)에 의존하고 있었으나, Docker 빌드 시 해당 모듈들을 컨텍스트에서 가져오지 못하는 문제가 발생했습니다. 특히, Gradle 빌드 단계에서 공통 모듈이 복사되지 않아 Could not get unknown property
에러가 발생했습니다.
Docker 빌드 컨텍스트 설정 오류
Docker 빌드 과정에서 프로젝트가 멀티모듈로 구성되어 있었지만, Docker 컨텍스트가 개별 서비스 모듈 기준으로 설정되어 있었습니다. 따라서 Docker 빌드 시 공통 모듈을 참조하지 못했고, 그 결과 의존성 문제가 발생했습니다.
Docker 빌드 컨텍스트를 루트 모듈로 설정
Docker 빌드 시 컨텍스트를 루트 모듈에서 시작하도록 수정하여, 모든 모듈을 참조할 수 있게 만들었습니다.
Docker-compose 설정
루트 모듈 기준으로 각 서비스 모듈에 대한 Docker-compose 설정을 추가했습니다.
services:
## 중략
auth:
image: ${DOCKER_HUB_NAMESPACE}/glowgrow-auth
container_name: auth
ports:
- "19099:19099"
build:
context: . # 루트 컨텍스트
dockerfile: ./auth/Dockerfile
args:
- FILE_DIRECTORY=.
environment:
- SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE}
depends_on:
- eureka
Dockerfile 수정
Dockerfile에서도 루트 컨텍스트에서 각 모듈을 참조할 수 있도록, FILE_DIRECTORY
변수를 사용하여 루트 컨텍스트를 전달했습니다.
# Stage 1: Build the application
FROM gradle:8.10.1-jdk17 AS build
WORKDIR /app
# ARG로 전달된 파일 디렉터리 설정
ARG FILE_DIRECTORY
# 파일 복사
COPY $FILE_DIRECTORY /app
# auth 모듈만 빌드
RUN ./gradlew :auth:clean :auth:build -x test --no-daemon
FROM openjdk:17-jdk-slim
COPY --from=build /app/auth/build/libs/*SNAPSHOT.jar /app.jar
# JAR 파일 실행
CMD ["java", "-jar", "/app.jar"]
이로써 루트 모듈에 존재하는 다른 모듈들에 대한 의존성을 정상적으로 참조하여 빌드가 가능해졌습니다.