더북(TheBook)

멀티스테이지 빌드 Dockerfile

이 절의 Dockerfile에서는 멀티스테이지 빌드(multistage build)를 사용한다. 왜 멀티스테이지(다단계)일까? 이 방식을 사용하면 애플리케이션 실행에 필수적이지 않은 것을 제외할 수 있기 때문이다. 예를 들어 스프링 부트의 경우 도커 이미지에 target 디렉터리를 모두 복사하는 대신 스프링 부트 애플리케이션에 실행하는 데 필요한 것만 복사하면 된다. 이 방식은 생성할 도커 이미지를 최적화한다. 다음 코드는 멀티스테이지 빌드 Dockerfile을 보여 준다.

코드 4-5 멀티스테이지 빌드 Dockerfile

# stage 1
# Start with a base image containing Java runtime
FROM openjdk:11-slim as build

# Add Maintainer Info
LABEL maintainer="Illary Huaylupo <illaryhs@gmail.com>"

# The application's jar file
ARG JAR_FILE

# Add the application's jar to the container
COPY ${JAR_FILE} app.jar

# unpackage jar file
RUN mkdir -p target/dependency && (cd target/dependency; jar -xf /app.jar) 

# stage 2 
# Same Java runtime
FROM openjdk:11-slim

# Add volume pointing to /tmp
VOLUME /tmp

# Copy unpackaged application to new container 
ARG DEPENDENCY=/target/dependency
COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF
COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app

# execute the application 
ENTRYPOINT ["java","-cp","app:app/lib/*","com.optimagrowth.license.
            LicenseServiceApplication"]

➊ 앞서 빌드 이미지의 파일 시스템에 복사한 app.jar의 압축을 푼다.

➋ 새로운 이미지는 스프링 부트 앱에 대한 통짜 JAR 파일 대신 여러 레이어로 구성된다.

➌ stage 1에서 build라고 명명된 첫 이미지에서 여러 레이어를 복사한다.

➍ 컨테이너가 생성될 때 이미지의 라이선싱 서비스를 실행 대상으로 지정한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.