Docker Multi-stage build

coffeepoter·2024년 10월 9일

HAF

목록 보기
2/2

현재 서버의 docker image들을 보면

위와 같다.

image가 점점 많아지면서 ec2의 volume을 게속 올리게 되었고

50GB까지 올려서 사용하고 있지만 현재 총 43GB를 사용하고 있다.

그렇기 때문에 docker image들의 용량을 줄이는 것이 우선이라 판단하였어 multi-stage build를 시도하였다.

원본 Dockerfile

#어떤 이미지로부터 새로운 이미지를 생성할지를 지정
FROM node

# /app 디렉토리 생성
RUN mkdir -p /app
# /app 디렉토리를 WORKDIR 로 설정
WORKDIR /app
# 현재 Dockerfile 있는 경로의 모든 파일을 /app 에 복사
ADD . /app
# npm install 을 실행
RUN npm install

#환경변수 NODE_ENV 의 값을 development 로 설정
ENV NODE_ENV development

# Expose the port
EXPOSE 1102

#컨테이너에서 실행될 명령을 지정
CMD ["npm", "start"]

Mulit-stage Dockerfile

# Node.js 빌드 환경 설정
FROM node:16-alpine as builder

# /app 디렉토리 생성 및 작업 디렉토리 설정
WORKDIR /app

# 코드 복사
COPY . /app

# npm 설치
RUN npm install

#--------------------------------------------

# 프로덕션 환경 설정
FROM node:16-alpine as production

# /app 디렉토리 생성 및 작업 디렉토리 설정
WORKDIR /app

# 빌드 결과물을 복사
COPY --from=builder /app /app

# 포트 노출
EXPOSE 1102

# 앱 실행
CMD ["npm", "start"]

multi-stage build로 coffeepoter/jwt_challenge_1:latest를 만들었고 해당 image의 size는 307MB로 이전의 oshean/jsonwebtoekn-wargame-v1:jwt.v1의 1.12GB에 비해 약 800MB가 감소한 것을 확인할 수 있었다.

같은 방식으로 coffeepoter/jwt_challenge_2:latest를 만들었고 해당 image의 size는 122MB로 이전의 oshean/jsonwebtoekn-wargame-v2:jwt.v2의 1.12GB에 비해 약 1GB가 감소한 것을 확인할 수 있었다.

oshean/stylish-injection 문제 또한 1.95GB에서 153MB로 약 1.4GB를 줄였다.

Dockerfile

FROM node

RUN mkdir -p /app
WORKDIR /app

ADD . /app

RUN npm install

RUN npm run postinstall --prefix ./node_modules/puppeteer

RUN apt-get update && apt-get install -y debian-archive-keyring

RUN apt-get update && apt-get install -y \
    libnss3 \
    libxss1 \
    libasound2 \
    fonts-liberation \
    libappindicator3-1 \
    xdg-utils \
    libatk-bridge2.0-0 \
    libatk1.0-0 \
    libpangocairo-1.0-0 \
    libgdk-pixbuf2.0-0 \
    libgtk-3-0 \
    libx11-xcb1

ENV NODE_ENV development

EXPOSE 1105

CMD ["npm", "start"]

Dockerfile_multi_stage

# Build stage (빌드 환경)
FROM node:18-alpine as builder

# /app 디렉토리 생성 및 작업 디렉토리 설정
WORKDIR /app

# 애플리케이션 코드 복사
COPY . /app

# npm 설치
RUN npm install

# Puppeteer 설치 (postinstall 스크립트 실행)
RUN npm run postinstall --prefix ./node_modules/puppeteer

# 필요한 라이브러리 설치
RUN apk add --no-cache \
    nss \
    chromium \
    harfbuzz \
    ca-certificates \
    ttf-freefont \
    bash \
    udev \
    dumb-init

# 빌드가 필요한 경우 추가

# Production stage (프로덕션 환경)
FROM node:18-alpine as production

# /app 디렉토리 생성 및 작업 디렉토리 설정
WORKDIR /app

# 필요한 파일 복사
COPY --from=builder /app /app

# 환경 변수 설정
ENV NODE_ENV production

# 포트 노출
EXPOSE 1105

# 앱 실행
CMD ["npm", "start"]

결과적으로 3개의 docker image를 multi-stage방식으로 변경하면서 약 4%정도 사용양을 줄였다.

0개의 댓글