Docker

[Docker] 멀티 스테이지 빌드

문승주 2024. 7. 18. 23:37
반응형

본 내용은 인프런의 데브위키님의 강의 "개발자를 위한 쉬운 도커" 내용을 바탕으로 정리한 내용입니다.

 

멀티 스테이지 빌드

  • 도커 파일에서 두 개의 베이스 이미지를 활용하는 방법
  • 빌드에 사용하는 이미지실행에 사용하는 이미지를 나눈다.
  • 멀티스테이징을 사용하면 불필요한 파일이나 의존성이 최종 이미지에 들어가지 않도록 하고, 이미지 크기를 줄이는 등의 이점을 얻을 수 있다.

멀티 스테이지 빌드 예시

VisualStudioCode

  • Build 테스트
# 04.javahelloapp 실습 폴더로 이동
cd ../04.javahelloapp

Dockerfile.singlestage

  • 경로 : easydocker/build/04.javahelloapp/Dockerfile.singlestage
  • 애플리케이션을 빌드하는 과정
  • FROM maven:3.6-jdk-11 : JAVA 애플리케이션을 빌드, 실행 가능한 베이스 이미지
  • COPY pom.xml : 의존 라이브러리 정보가 저장된 pom.xml파일 /app 으로 복사
  • COPY src ./src : 애플리케이션 소스파일 /app 으로 복사
  • RUN mvn clean package : 애플리케이션 빌드
  • RUN cp /app/target/*.jar ./app.jar : 빌드된 아티팩트 복사
  • CMD [₩"java₩", ₩"-jar₩", ₩"app.jar₩"] : 컨테이너 실행시 아티팩트 실행
FROM maven:3.6-jdk-11 
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package
RUN cp /app/target/*.jar ./app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]

Dockerfile

  • 경로 : easydocker/build/04.javahelloapp/Dockerfile
  • 애플리케이션 빌드와 실행 과정을 분리
  • FROM maven:3.6 AS build : JAVA 애플리케이션을 빌드하기 위해 maven 베이스 이미지 사용
  • RUN mvn clean package : JAVA 애플리케이션을 빌드
  • FROM openjdk:11-jre-slim : JAVA 애플리케이션을 실행하기 위해 openjdk 베이스 이미지 사용
  • COPY --from=build /app/target/*.jar ./app.jar : build 에서 실행 이미지로 파일 복사
 # 첫번째 단계: 빌드 환경 설정
FROM maven:3.6 AS build ----------------------- JAVA 애플리케이션을 빌드하기 위해 maven 베이스 이미지 사용
WORKDIR /app

# 소스코드 복사
COPY pom.xml    .
COPY src ./src

# 애플리케이션 빌드
RUN mvn     clean package

# 두번째 단계: 실행 환경 설정
FROM openjdk:11-jre-slim --------------------- JAVA 애플리케이션을 실행하기 위해 openjdk 베이스 이미지 사용

WORKDIR /app

# 빌드 단계에서 생성된 JAR    파일 복사
COPY --from=build /app/target/*.jar ./app.jar -------------- build 에서 실행 이미지로 파일 복사
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]
  • COPY 부분에서 from=build를 사용하여 다른 스테이지의 파일을 가져올 수 있다.
  • 두 번째 FROM 애플리케이션 실행과정에서 maven 빌드에 사용된 모든파일들을 제외하고 jar 파일만 가져올 수 있다.

Docker Image 빌드 테스트

# 1. 단일 스테이지 이미지 빌드 및 조회
docker build -f Dockerfile.singlestage -t javaappsingle .
docker image ls javaappsingle

# 2. 멀티 스테이지 이미지 빌드 및 조회
docker build -f Dockerfile.multistage -t javaappmulti .
docker image ls javaappmulti
반응형