현재 서버의 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%정도 사용양을 줄였다.
