[Docker] Multi Stage

2024. 9. 20. 10:45·기타/Docker

 

Overview

Multi Stage build 는 말그대로 

여러 스테이지를 가지고 빌드 하는 것을 말한다.

stage란 무엇인가?

Docker 이미지 빌드의 각 단계라고 보면된다.

 

다음은 Build stage  와 Running Stage 를 구성한 예다.

Running stage 는 build 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' 카테고리의 다른 글

[Error] Docker Desktop - WSL integration with distro 'Ubuntu' Unexpectdly stopped. Do you want to restart it?  (0) 2025.04.17
[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' 카테고리의 다른 글
  • [Error] Docker Desktop - WSL integration with distro 'Ubuntu' Unexpectdly stopped. Do you want to restart it?
  • [Docker] manifest digest vs index digest
  • [Docker] credential
  • [Docker] Docker network for communication among containers
M_Falcon
M_Falcon
  • M_Falcon
    Falcon
    M_Falcon
  • 전체
    오늘
    어제
    • 분류 전체보기 (429) N
      • Web (16)
        • Nodejs (14)
        • Javascript (23)
        • FrontEnd (4)
      • DataBase (39)
        • Fundamental (1)
        • Redis (4)
        • PostgreSQL (10)
        • NoSQL (4)
        • MySQL (9)
        • MSSQL (3)
        • Error (4)
      • Algorithm (79)
        • Algorithm (문제풀이) (56)
        • Algorithm (이론) (23)
      • JVM (64) N
        • Spring (13)
        • JPA (5)
        • Kotlin (13)
        • Java (23) N
        • Error (7)
      • 기타 (68)
        • Kafka (3)
        • Kubernetes (3)
        • Docker (12)
        • git (19)
        • 잡동사니 (26)
      • 재테크 (11)
        • 세무 (4)
        • 투자 (3)
        • 보험 (0)
      • BlockChain (2)
        • BitCoin (0)
      • C (32)
        • C (10)
        • C++ (17)
        • Error (3)
      • Low Level (8)
        • OS (3)
        • 시스템 보안 (5)
      • 네트워크 (3)
      • LINUX (30)
        • Linux (26)
        • Error (4)
      • 저작권과 스마트폰의 이해 (0)
      • 생각 뭉치 (6)
      • 궁금증 (2)
      • Private (4)
        • 이직 경험 (0)
        • 꿈을 찾아서 (1)
      • Android (21)
        • OS (4)
  • 블로그 메뉴

    • 홈
    • WEB
    • 알고리즘
    • DataBase
    • Linux
    • Mobile
    • C
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    algorithm
    Bitcoin
    javascript
    백준
    C++
    PostgreSQL
    ubuntu
    Programmers
    linux
    Kotlin
    java
    android
    JPA
    database
    kafka
    Spring
    프로그래머스
    docker
    Git
    알고리즘
  • hELLO· Designed By정상우.v4.10.3
M_Falcon
[Docker] Multi Stage
상단으로

티스토리툴바