애플리케이션 개발 시에 개발 환경에서 사용한 라이브러리나 개발 지원 툴이 제품 환경에서 반드시 사용되는 것은 아니며,
제품 환경에는 애플리케이션을 실행하기 위해 최소한으로 필요한 실행 모듈만 배치하는 것이 컴퓨팅 리소스를 효율적으로 활용할 수 있다는 점에서 보안 관점으로 볼 때 바람직합니다.
이럴때 멀티스테이지 빌드를 사용하게 됩니다.
1. 멀티스테이지 빌드란?
컨테이너 이미지를 만들면서 빌드할때는 필요하지만, 최종 컨테이너 이미지에는 필요 없는 환경을 제거할 수 있도록 단계를 나누어 기반 이미지를 만드는 방법
위의 그림처럼 컨테이너 RUN PHASE에는 빌드에 사용한 파일 및 디렉토리과 같은 의존 파일들이 모두 삭제된 상태로 컨테이너가 실행되게 됩니다.
이를 Dockerfile을 통해 확인하면 다음과 같습니다.
# 1. build 관련된 부분부터 처리
FROM node:14-alpine as build
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
RUN npm run build
# 2.빌드 이후 다시 새로운 stage 시작
FROM nginx:stable-alpine
COPY --from=build /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
위 dockerfile을 기반으로 build를 실행합시다.
최종 생성되는 이미지에는 빌드 이후의 결과물만 저장되게 됩니다.
빌드 결과물을 확인해보면 일반 빌드보다 용량이 확연하게 줄어든것을 확인할 수 있습니다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] 유틸리티 컨테이너 (0) | 2022.10.01 |
---|---|
[Docker] 도커 컴포즈 (Docker Compose) (0) | 2022.09.29 |
[Docker] 다중 컨테이너 구성 (0) | 2022.09.28 |
[Docker] 컨테이너 통신 (0) | 2022.09.18 |
[Docker] 도커의 환경변수 설정 (1) | 2022.09.15 |
댓글