멀티스테이지 빌드 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라고 명명된 첫 이미지에서 여러 레이어를 복사한다.
➍ 컨테이너가 생성될 때 이미지의 라이선싱 서비스를 실행 대상으로 지정한다.