TIL(210923): Docker image 최적화

최수민·2021년 9월 22일
0

TIL

목록 보기
8/8
post-thumbnail

local-sqs의 pre-alpha 버전을 배포했는데, 생각외로 이미지 사이즈가 너무 컸다. 무려 391.6MB였다..!

제공하는 기능에 비해 너무 큰 사이즈다. (나라도 안 쓸듯) 도커 이미지 사이즈를 줄여야한다.

도커 이미지 사이즈를 줄이는 방법?

크게 두 가지가 존재한다.

  1. 더 작은 Base Image를 사용하는 것
  2. 불필요한 파일들이 포함되지 않도록하는 것

나는 두 가지를 다 적용해봤다!

1. 더 작은 Base Image 사용하기

원래 node:16을 사용했는데, node:16-alpine으로 변경했다.

alpine은 정말 필요한 기능만 남긴 경량화 linux가 설치된 컨테이너이다. 알파인 리눅스 이미지의 용량은 5MB밖에 안 된다!

# before
FROM node:16

# after
FROM node:16-alpine

2. 불필요한 파일들이 포함되지 않도록 하기

정말로 실행에 필요한 파일들만 이미지에 포함되도록하면 된다!
이를 위해 먼저 .dockerignore를 설정해줬다.

.github
coverage
dist
node_modules

*eslint*
*git*
*prettier*
jest*
nodemon.json
*.md

npm-debug.log

두 번째로는 이미지 생성시 정말로 실행에 필요한 패키지들만 포함되도록 Dockerfile 빌드를 두 단계로 나눴다.

FROM node:16-alpine as development

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install --only=development

COPY . .

RUN npm run build

FROM node:16-alpine as production

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install --only=production

COPY . .

COPY --from=development /usr/src/app/dist ./dist

ARG PORT=4413
ENV PORT=${PORT}
ARG IP="0.0.0.0"
ENV IP=${IP}

LABEL authors="greatSumini@gmail.com"

CMD [ "node", "dist/main" ]

production 단계에서 실행에 필요한 패키지만 설치하고, 빌드 결과물은 development 단계에서 가져다 실행만 한다.

3. 최적화 성공!

392MB에서 43MB로 최적화 성공했다 🥳

참고 링크들

profile
velog에는 TIL, 잡담만 올립니다! 아티클들은 블로그로 (https://sumini.dev)

0개의 댓글