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
반응형