Docker image 크기 줄여보기

초보개발·2022년 12월 26일
2

프로젝트에는 여러 마이크로서비스가 포함되어 있다. 각 서비스마다 Dockerfile을 작성하고 Docker-compose를 작성해서 배포를 완료하였다. 이전에는 Dockerfile에 multi stage나 경량화된 jdk 이미지를 사용하지 않아 400-500 MB 용량의 이미지로 배포가 되었다. 각 서비스(spring boot로 구현된 모듈)들을 빌드하고 배포하는데 많은 시간이 소요되었다.
따라서 이번에는 경량화된 이미지와 multi stage를 이용해 이미지 용량을 낮추고자 한다.

기존 Dockerfile

FROM openjdk:17-ea-11-jdk-slim
VOLUME /tmp
COPY build/libs/user-service-0.0.1-SNAPSHOT.jar userService.jar
ENTRYPOINT ["java", "-jar", "userService.jar"]

사용한 jdk 이미지의 용량은 201.29 MB(압축된 크기)이다. 이 dockerfile은 로컬에서 빌드한 jar 파일을 docker 내부로 복사해 서버를 켜는 방식이다.

  • 용량: 473.63 MB

바뀐 후의 Dockerfile

# builder
FROM openjdk:17-ea-11-jdk-slim as build
WORKDIR /workspace/app

COPY gradle gradle
COPY build.gradle settings.gradle gradlew ./
COPY src src

RUN ./gradlew bootJar
RUN mkdir -p build/libs/dependency && (cd build/libs/dependency; jar -xf ../*.jar)

# running
FROM openjdk:11-jre-slim-buster
VOLUME /tmp
ARG DEPENDENCY=/workspace/app/build/libs/dependency

COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app
COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF

ENTRYPOINT ["java", "-cp","app:app/lib/*", "com.mardi2020.userservice.UserServiceApplication"]
  • stage 1
    stage 2에서 사용할 executable jar를 생성하기 위한 파일들을 workdir로 copy한다.

  • stage 2
    openjdk:11-jre-slim-buster(66.85 MB, 압축된 크기)의 경량화된 이미지를 사용했다.
    이 스테이지에서는 java 컴파일이 필요없기 때문에 jdk가 아닌 jre를 사용하여 용량을 더 줄일 수 있었다.

  • 용량: 300.46 MB

결과

  • 473.63 MB -> 300.46 MB

기존에는 변경될때마다 로컬에서 jar파일을 생성하고 docker build를 수행하였다. 바뀐 후에는 bootJar 과정도 포함되어 번거로움을 줄였으며 multi stage와 경량화 이미지를 사용하여 빌드, 배포 시간을 단축시킬 수 있었다.

0개의 댓글