카테고리 없음

multi-stage를 활용하여 docker build size 줄이기

소이소 2025. 5. 8. 17:26

배경

현재 프론트엔드 폴더를 빌드한 docker image를 container에 띄우는데, docker를 빌드할때 오랜 시간이 걸린다는 인프라 엔지니어의 도움요청이 있었다. 현재 docker image를 분석해보고 멀티 스테이지를 적용해보았다!

도입

기존 dockerfile

FROM node:18.18.0-alpine
WORKDIR /usr/src/app
COPY package.json yarn.lock ./
RUN yarn install
COPY . .
ENV NUXT_APP_API_URL=https://dapulai-main-fe-dev.nxsai.com/api
ENV NUXT_APP_URL=https://dapulai-main-fe-dev.nxsai.com
ENV NUXT_API_SECRET_KEY=default_value
ENV NUXT_APP_KAKAO_APP_KEY=56d18ac067d80c364addf7b243d04c94
ENV NUXT_APP_SHARE_URL=https://dapulai-main-fe-dev.nxsai.com
ENV NUXT_APP_FONTAWESOME_KEY=7b35c93c6c
RUN yarn build
CMD ["node", ".output/server/index.mjs"]

 

빌드할때 COPY . . 명령어로 모든 파일을 복사하고, node_modules 폴더가 모두 이미지에 포함되었다. 개발 도구, 빌드 도구, 테스트 파일 불필요한 파일들이 포함되면서 이미지 크기가 커졌던 것이다. 그러면 이미지에서 사용되지 않은 파일들을 이미지 실행할때 제거하면 크기가 가벼워지지 않을까? 

 

멀티스테이지(multi-stage)는 무엇인가

멀티스테이지 설명

docker는 각 stage에서 필요한 파일만 가져와서 가장 마지막에 실행된 stage로 최종 이미지를 구성한다.

이러한 특성을 활용해 build stage 와 production stage 컨테이너 작업 단위를 분리한다.

production stage에서는 build stage에서 산출된 build 결과물을 가져온다. 빌드 캐시를 활용해 중복된 작업을 피하고, 서비스를 실행하는데 사용되지 않는 빌드 파일이 최종 이미지에 포함되지 않아 빌드 크기가 줄어든다.

Dockerfile 코드 작성하기

// Build Stage
FROM node:18.18.0-alpine AS build
WORKDIR /usr/src/app
COPY package.json yarn.lock ./
RUN yarn install
COPY . .
RUN yarn build:$env

// Production Stage
FROM node:18.18.0-alpine
WORKDIR /usr/src/app
COPY --from=build /usr/src/app/.output ./.output
COPY --from=build /usr/src/app/package.json ./package.json
CMD ["node", ".output/server/index.mjs"]

결과

멀티스테이지 적용한 build 크기 변화

→ multi-stage 를 적용했을때 용량이 2.46GB 에서 184.38MB 로 용량 감소

 

🙇‍♂️ 참고문헌

Dockerfile - Multi-stage build(멀티스테이지 빌드)