Docker 를 활용해 각 서비스 모듈을 빌드하고 배포하는 CI/CD 파이프라인을 구축하던 중 멀티 모듈 프로젝트에서의 Docker 관련 문제를 겪었습니다.

1. 문제

Docker 빌드 컨텍스트에서 모듈 참조 문제

멀티모듈 구조의 프로젝트에서 각 서비스 모듈이 공통 모듈(예: common, security)에 의존하고 있었으나, Docker 빌드 시 해당 모듈들을 컨텍스트에서 가져오지 못하는 문제가 발생했습니다. 특히, Gradle 빌드 단계에서 공통 모듈이 복사되지 않아 Could not get unknown property 에러가 발생했습니다.

image.png


2. 원인

Docker 빌드 컨텍스트 설정 오류

Docker 빌드 과정에서 프로젝트가 멀티모듈로 구성되어 있었지만, Docker 컨텍스트가 개별 서비스 모듈 기준으로 설정되어 있었습니다. 따라서 Docker 빌드 시 공통 모듈을 참조하지 못했고, 그 결과 의존성 문제가 발생했습니다.


3. 해결

  1. Docker 빌드 컨텍스트를 루트 모듈로 설정

    Docker 빌드 시 컨텍스트를 루트 모듈에서 시작하도록 수정하여, 모든 모듈을 참조할 수 있게 만들었습니다.

  2. 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
    
    
  3. 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"]
    
    

이로써 루트 모듈에 존재하는 다른 모듈들에 대한 의존성을 정상적으로 참조하여 빌드가 가능해졌습니다.