2.멀티 스테이지 빌드
위 Dockerfile 스크립트에서는 멀티 스테이지(Multi-stage) 빌드가 이용되었음
→ 하나의 Dockerfile 내에 FROM 명령어가 2개 이상일 경우 멀티 스테이지 빌드라고 볼 수 있음
도커 이미지를 빌드할 때, 실제 운영 상황에서 필요한 모듈(요소)들만 사용하기 위해 불필요한 모듈은 제외할 수 있도록 이미지 빌드 단계를 구분하여 빌드하는 방식
→ 개발 환경에서는 사용했지만, 운영 환경에서는 필요하지 않은 모듈(ex. 테스팅 라이브러리, 빌드 도구 등)
1-1. Dockerfile을 개별 스테이지로 구분할 경우
1-1-1. builder 단계
builder 단계에서는 Java 애플리케이션 빌드에 필요한 단계 위주로 작성
FROM diamol/maven AS builder
WORKDIR /usr/src/iotd
COPY pom.xml .
RUN mvn -B dependency:go-offline
COPY . .
RUN mvn packageFROM 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. 애플리케이션 생성 단계
애플리케이션 생성 단계에서는 실제 애플리케이션을 실행하기 위해 필요한 단계 위주로 작성
# 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 파일 실행하도록 지정