Skip to Content
Suffering builds character

2.멀티 스테이지 빌드

위 Dockerfile 스크립트에서는 멀티 스테이지(Multi-stage) 빌드가 이용되었음
→ 하나의 Dockerfile 내에 FROM 명령어가 2개 이상일 경우 멀티 스테이지 빌드라고 볼 수 있음

도커 이미지를 빌드할 때, 실제 운영 상황에서 필요한 모듈(요소)들만 사용하기 위해 불필요한 모듈은 제외할 수 있도록 이미지 빌드 단계를 구분하여 빌드하는 방식

→ 개발 환경에서는 사용했지만, 운영 환경에서는 필요하지 않은 모듈(ex. 테스팅 라이브러리, 빌드 도구 등)

1-1. Dockerfile을 개별 스테이지로 구분할 경우

1-1-1. builder 단계

builder 단계에서는 Java 애플리케이션 빌드에 필요한 단계 위주로 작성

Dockerfile
FROM diamol/maven AS builder WORKDIR /usr/src/iotd COPY pom.xml . RUN mvn -B dependency:go-offline COPY . . RUN mvn package

FROM diamol/maven AS builder
빌드 도구인 Maven과 OpenJDK가 포함된 이미지
해당 단계 이름을 builder로 별칭 지정

RUN mvn -B dependency:go-offline
mvn 명령어를 통해 애플리케이션 빌드에 필요한 의존성 모듈을 설치

COPY . .
도커 이미지 빌드가 수행되고 있는 현재 경로에 포함된 모든 파일 및 폴더(하위 폴더 포함)를 빌드될 이미지 내 디렉토리(/usr/src/iotd)에 전부 복사

RUN mvn package
mvn package 명령어를 실행하여 Java 애플리케이션 빌드 진행

builder 단계가 정상적으로 수행되면 빌드된 결과물인 .jar 파일이 빌드된 도커 이미지 내 파일 시스템에 생성됨

1-1-2. 애플리케이션 생성 단계

애플리케이션 생성 단계에서는 실제 애플리케이션을 실행하기 위해 필요한 단계 위주로 작성

Dockerfile
# app FROM diamol/openjdk WORKDIR /app COPY --from=builder /usr/src/iotd/target/iotd-service-0.1.0.jar . EXPOSE 80 ENTRYPOINT ["java", "-jar", "/app/iotd-service-0.1.0.jar"]

FROM diamol/openjdk
Java 런타임인 OpenJDK가 포함된 이미지
→ Maven은 포함되지 않은 이미지(Maven은 운영 환경에서 필요 없기 때문에 제외)

COPY —from=builder /usr/src/iotd/target/iotd-service-0.1.0.jar .

—from=builder
builder 단계에서 생성된 .JAR 파일을 현재 경로(.)에 복사

EXPOSE 80
80 포트에서 동작하도록 지정

ENTRYPOINT [“java”, “-jar”, “/app/iotd-service-0.1.0.jar”]
ENTRYPOINT 명령어는 CMD와 동일한 기능을 하는 명령어로, java 명령어를 통해 .jar 파일 실행하도록 지정

Last updated on