내 잡다한 노트

Dockerfile 멀티 스테이지 빌드 본문

DevOps/docker

Dockerfile 멀티 스테이지 빌드

peanutwalnut 2024. 11. 30. 17:44

**멀티스테이지 빌드(Multi-stage Build)**는 Dockerfile에서 단계별로 빌드 환경을 분리하고, 최종 실행에 필요한 최소한의 파일만 포함하여 경량화된 이미지를 생성하는 방식입니다.

 

멀티스테이지 빌드란?

멀티스테이지 빌드는 Dockerfile 내에서 여러 베이스 이미지를 정의하고, 각 단계(stage)에서 작업을 수행하며, 최종 단계에서는 필요한 파일만 가져옵니다.

  • 빌드 도구(컴파일러, 패키지 매니저 등)는 중간 단계에서만 사용하고, 최종 이미지는 실행 파일이나 애플리케이션 코드만 포함.
  • 최종 이미지는 작고, 불필요한 파일(빌드 도구 등)이 제거된 상태로 배포.

 

 

멀티스테이지 빌드를 사용하는 이유

  1. 이미지 크기 최소화
    • 빌드 과정에서 필요한 도구(예: gcc, make)가 최종 이미지에 포함되지 않으므로 이미지 크기를 줄일 수 있습니다.
  2. 보안 강화
    • 민감한 데이터(빌드 환경 변수, API 키 등)를 최종 이미지에 포함하지 않음.
  3. 단일 Dockerfile로 관리
    • 빌드와 실행을 별도의 Dockerfile로 관리하지 않고, 하나의 Dockerfile에서 처리.
  4. 재사용성 증가
    • 단계별로 필요한 작업만 수행하므로 유지보수가 쉬워짐.

 

 

멀티스테이지 빌드 기본 구조

# 1단계: 빌드 환경
FROM <빌드 이미지> AS builder
WORKDIR /app
COPY . .
RUN <빌드 명령>

# 2단계: 실행 환경
FROM <경량 실행 이미지>
WORKDIR /app
COPY --from=builder /app/<필요한 파일> .
CMD ["<실행 명령>"]

 

 

1. Go 애플리케이션 예제

 

# 1단계: 빌드 환경
FROM golang:1.19 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

# 2단계: 실행 환경
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]

 

 

2. Node.js 애플리케이션 예제

 

# 1단계: 빌드 환경
FROM node:16 AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build

# 2단계: 실행 환경
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]

 

3. Python 애플리케이션 예제

 

# 1단계: 빌드 환경
FROM python:3.9 AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 2단계: 실행 환경
FROM python:3.9-slim
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
COPY . .
CMD ["python", "app.py"]

 

 

4. 자바(Jar 파일) 애플리케이션 예제

 

# 1단계: 빌드 환경
FROM maven:3.8-openjdk-17 AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests

# 2단계: 실행 환경
FROM openjdk:17-slim
WORKDIR /app
COPY --from=builder /app/target/app.jar .
CMD ["java", "-jar", "app.jar"]

 

 

멀티스테이지 빌드의 주요 기술적 요소

1. --from=STAGE_NAME 사용

  • 이전 단계에서 생성된 파일이나 디렉토리를 복사.
  • 단계 이름을 지정하여 직관적으로 관리.

FROM golang:1.19 AS build-stage
WORKDIR /app
COPY . .
RUN go build -o myapp .

FROM alpine:latest
WORKDIR /app
COPY --from=build-stage /app/myapp .

 

2. 캐싱 활용

  • 변경되지 않은 단계는 캐시를 재사용하여 빌드 속도 최적화.

FROM python:3.9 AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN python setup.py install

 

'DevOps > docker' 카테고리의 다른 글

도커 컨테이너와 VM의 차이  (0) 2024.12.05
Dockerfile 최적화 방안  (0) 2024.11.30
도커파일에서 UID를 작성하는 이유  (0) 2024.11.26
DooD ( Docker out of Docker )  (0) 2024.11.19
도커파일 지시어 정리  (0) 2024.10.18