Overview
Multi Stage build 는 말그대로
여러 스테이지를 가지고 빌드 하는 것을 말한다.
stage란 무엇인가?
Docker 이미지 빌드의 각 단계라고 보면된다.
다음은 Build stage 와 Running Stage 를 구성한 예다.
최종 이미지는 ./myapp 을 실행하기 위한 최소한의 환경만 세팅되어있다.
go compiler 같은 파일은 제외되어있다.
Why to Use
그렇담 왜 쓰는 것일까?
1. 이미지 크기 경량화
최종 생성 이미지는 마지막 stage 의 Layer 에서만 만들어지기 때문에 불필요한 설치파일 등을 제외할 수 있다.
2. 더 빠른 빌드
통상 builder stage 가 running stage 보다 더 오래걸린다.
필요한 의존성을 설치하고, 실행파일을 빌드하기 때문이다.
builder stage (의존성 , 환경 설정)에는 변화가 없고, running stage 에만 변화가 있는 경우
builder stage 는 통째로 캐싱된 layer 를 사용하기 때문에 이미지 빌드 소요 시간을 줄일 수 있다.
# Stage 1: Builder
FROM node:16 as builder
WORKDIR /app
# Install dependencies
COPY package.json package-lock.json ./
RUN npm install
COPY . .
# typescript build
RUN npm run build
# Stage 2: Runtime environment
FROM node:16-alpine
WORKDIR /app
# Copy only the build artifacts from the first stage
COPY --from=builder /app/dist /app/dist
COPY --from=builder /app/node_modules /app/node_modules
COPY --from=builder /app/package.json /app.package.json
CMD ["node", "app.js"]
소스코드만 바뀌고 의존성이 그대로 (package.json, node_modules) 인 경우
/app/node_modules , /app/package.json 은 캐싱된 레이어를 재사용한다.
오로지 npm run build -> /app/dist 만 변경된다.
따라서 이미지 빌드 시간이 단축된다.
사실 빌드시간 소요단축 효과는 여기저기 소개되어 있지만,
Multi-Stage 라서 시간을 단축했다기보다
Docker 의 Caching Layer 매커니즘이 빌드 시간을 단축하는 것이다.
When to Use
이미지 크기 경량화, 더 빠른 빌드가 필요할 때
How to use
사용법은 간단하다.
FROM 절을 2개 이상으로 쪼개면 2개 이상의 Stage 를 갖게된다.
Build Context
docker build 명령어 실행시 지정된 Path 가 곧 build context 가 된다.
이는 Docker image build 시 사용할 Local file system 과 같은 의미다.
'기타 > Docker' 카테고리의 다른 글
[Docker] manifest digest vs index digest (0) | 2024.10.21 |
---|---|
[Docker] credential (0) | 2024.08.09 |
[Docker] Docker network for communication among containers (0) | 2023.04.23 |
[Docker] Host to container network (0) | 2023.04.19 |
[Docker] volume with CLI (0) | 2022.05.19 |