내 잡다한 노트
Dockerfile 멀티 스테이지 빌드 본문
**멀티스테이지 빌드(Multi-stage Build)**는 Dockerfile에서 단계별로 빌드 환경을 분리하고, 최종 실행에 필요한 최소한의 파일만 포함하여 경량화된 이미지를 생성하는 방식입니다.
멀티스테이지 빌드란?
멀티스테이지 빌드는 Dockerfile 내에서 여러 베이스 이미지를 정의하고, 각 단계(stage)에서 작업을 수행하며, 최종 단계에서는 필요한 파일만 가져옵니다.
- 빌드 도구(컴파일러, 패키지 매니저 등)는 중간 단계에서만 사용하고, 최종 이미지는 실행 파일이나 애플리케이션 코드만 포함.
- 최종 이미지는 작고, 불필요한 파일(빌드 도구 등)이 제거된 상태로 배포.
멀티스테이지 빌드를 사용하는 이유
- 이미지 크기 최소화
- 빌드 과정에서 필요한 도구(예: gcc, make)가 최종 이미지에 포함되지 않으므로 이미지 크기를 줄일 수 있습니다.
- 보안 강화
- 민감한 데이터(빌드 환경 변수, API 키 등)를 최종 이미지에 포함하지 않음.
- 단일 Dockerfile로 관리
- 빌드와 실행을 별도의 Dockerfile로 관리하지 않고, 하나의 Dockerfile에서 처리.
- 재사용성 증가
- 단계별로 필요한 작업만 수행하므로 유지보수가 쉬워짐.
멀티스테이지 빌드 기본 구조
# 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 |