GPT Archiving

dockerfile - 의존성 캐싱

99duuk 2025. 1. 6. 12:13


COPY build.gradle settings.gradle gradlew /app/
COPY gradle /app/gradle
  • 역할:

    • 프로젝트의 Gradle 설정 파일(build.gradle, settings.gradle)과 Gradle Wrapper(gradlewgradle 디렉토리)를 Docker 이미지로 복사.
    • Gradle Wrapper는 Gradle 버전을 일관되게 관리하며, 빌드 환경에 Gradle이 설치되어 있지 않아도 프로젝트를 빌드할 수 있게 합니다.
  • 왜 필요한가?:

    • Gradle Wrapper는 Gradle 버전을 명시적으로 관리하여 빌드 환경의 종속성을 제거합니다.
    • 이 단계에서 소스 코드를 복사하지 않고 설정 파일만 복사하는 이유는 의존성 캐싱 때문입니다. Gradle 의존성은 build.gradlesettings.gradle을 기준으로 처리되므로, 이 두 파일이 변경되지 않는 한 의존성을 다시 다운로드하지 않도록 캐시할 수 있습니다.

RUN ./gradlew dependencies --no-daemon
  • 역할:

    • ./gradlew dependencies 명령을 실행하여 프로젝트의 모든 의존성을 다운로드.
    • 이 과정에서 Gradle 캐시를 활용하여 동일한 의존성을 여러 번 다운로드하지 않도록 최적화.
  • 왜 필요한가?:

    • 의존성 다운로드는 네트워크 요청이 포함되므로 시간이 많이 걸립니다.
    • 소스 코드가 변경되더라도 의존성 파일이 동일하다면 이 단계를 다시 실행할 필요가 없습니다.
    • Docker는 RUN 명령의 결과를 캐시하기 때문에, build.gradle이나 settings.gradle이 변경되지 않으면 의존성을 다시 다운로드하지 않습니다.

COPY src /app/src
  • 역할:

    • 애플리케이션의 소스 코드를 /app/src로 복사.
  • 왜 이 단계가 나중에 오나요?:

    • 소스 코드는 자주 변경될 가능성이 높습니다.
    • Docker는 이전 단계의 캐시를 최대한 활용하기 때문에, 소스 코드 복사를 빌드 과정의 마지막 부분으로 미뤄두면, 의존성 다운로드 단계는 변경되지 않습니다.
    • 이렇게 하면 소스 코드가 변경되더라도 의존성을 다시 다운로드하지 않아도 되므로 빌드 속도가 빨라집니다.

RUN ./gradlew bootjar --no-daemon
  • 역할:

    • ./gradlew bootjar 명령을 실행하여 Spring Boot 애플리케이션의 실행 가능한 JAR 파일(bootJar)을 빌드.
  • 옵션 설명:

    • --no-daemon: Gradle 데몬을 사용하지 않고 실행. Docker 환경에서는 Gradle 데몬이 실행되는 동안 컨테이너가 종료되면 데몬이 불필요하게 남아 있을 수 있기 때문에, 데몬을 비활성화하여 메모리와 자원을 절약합니다.
  • 왜 이 단계에서 소스 코드가 필요하나요?:

    • 이 단계에서는 소스 코드를 기반으로 컴파일과 패키징이 이루어지기 때문입니다.
    • 빌드 결과물(build/libs/app.jar)이 생성됩니다.

  1. 의존성 캐싱:

    • build.gradlesettings.gradle만 변경되지 않으면, 의존성 다운로드를 캐시하여 빌드 속도를 크게 향상시킬 수 있습니다.
  2. 소스 코드 변경 분리:

    • 소스 코드는 가장 마지막 단계에 복사되므로, 변경된 경우에도 의존성 다운로드를 건너뛰고 바로 빌드할 수 있습니다.
  3. bootJar만 빌드:

    • 실행 가능한 Spring Boot 애플리케이션 JAR 파일만 생성하도록 설정, 불필요한 작업 생략.

이 과정은 Docker 빌드를 효율적으로 관리하기 위해 설계되었습니다. Gradle 설정 파일과 의존성 캐싱을 활용하여 빌드 속도를 최적화하고, 소스 코드 변경이 잦아도 빌드 과정을 최소화할 수 있도록 설계되었습니다. 🚀

'GPT Archiving' 카테고리의 다른 글

Java - CompletableFuture & addCallBack  (0) 2025.01.06
kafka - ProducerRecord  (0) 2025.01.06
kafka Sticky  (0) 2025.01.06
dockerfile - booJar, plain Jar  (1) 2025.01.06