티스토리 뷰
대부분의 어플리케이션은 언어나 종류에 상관없이 빌드타임, 런타임 이렇게 두종류의 의존성이 존재합니다
일반적으로 당연하게도 빌드타임의 의존성이 런타임보다 훨씬 많고, 크고, 복잡합니다
그리고 배포용 의존성만이 최종 배포될 이미지에 필요합니다
컨테이너환경에서 빌드를 하는것은 이제는 너무 흔한 전략입니다
누가 빌드를 하던지 같은 환경 및 도구를 이용하여 빌드 프로세스가 진행되는 것임을 보장합니다
그리고 컨테이너를 통해 앱을 실행하는 것도 이제는 사실상의 표준입니다
그러나 빌드와 앱실행은 완전히 다른 종류의 요구사항과 문제가 있습니다
그렇기 때문에 빌드와 런타임 이미지는 분리될수 있으며, 분리해야 합니다
그럼에도 불구하고, 배포용 이미지에 linter, 컴파일도구, devtool까지도 포함되는 경우가 있습니다
예를 들어볼까요
아래의 Dockerfile은 흔하게 우리가 볼수 있는 nodejs 프로젝트를 도커화한 파일입니다
FROM node:lts-slim
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build
ENV NODE_ENV=production
EXPOSE 3000
CMD ["node", "/app/.output/index.mjs"]
node:lts-slim 이미지는 debian:slim 이미지 위에 node, npm, yarn 이 설치되어 있습니다
이 docker 파일을 기반으로 이미지를 빌드하는 경우
OS + node(npm, yarn) + 소스코드 + node_modules + 빌드output
이렇게 모든 파일들이 포함된 이미지가 생성됩니다
그림으로 표시하면 이런식으로 이미지가 크기별로 구성되어있을 겁니다
node_modules 사이즈가 얼마나 큰지 짐작을 해볼까요
예를 들어 nuxt3 프레임워크를 이용하여 기본 프로젝트를 생성하고 위의 dockerfile과 같은 구성으로 이미지를 빌드했다면
그 최종이미지에는 500MB나 되는 node_modules 파일들이 포함되게 됩니다
이렇게 뚱뚱한 이유는 npm ci 단계에서 production과 development용 모든 의존성이 설치되기 때문입니다
그렇다면 어떻게 이미지를 줄여볼 수 있을까요?
바로 멀티스테이지(multi-stage) 빌드를 활용하는 것입니다
docker는 단계별 빌드를 지원합니다
빌드스테이지와 런타임스테이지를 구분한 dockerfile을 살펴보시죠
# 빌드스테이지
FROM node:lts-slim AS build
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build
# 런타임스테이지
FROM node:lts-slim AS runtime
WORKDIR /app
COPY --from=build /app/.output .
ENV NODE_ENV=production
EXPOSE 3000
CMD ["node", "/app/.output/index.mjs"]
이런식으로 단계를 빌드와 런타임으로 구분할수 있습니다
COPY --from=<stage>
명령어를 통해서 특정 스테이지에서의 파일들을 복사할 수 있습니다
이렇게 되면 여러분이 만든 최종 배포될 이미지에는
미니멀한 OS와, nodejs 런타임, 그리고 빌드 아티팩트만 존재하게 되어 최소한의 사이즈를 유지할수 있습니다
이는 당연하게도 보안에서도 유리합니다
참고
https://labs.iximiuz.com/tutorials/docker-multi-stage-builds
'WEB2.0 > 프로그래밍' 카테고리의 다른 글
arm64 기반의 github action runner를 사용해보았습니다 (0) | 2024.06.18 |
---|---|
리팩터링 내성을 키우는 lint, explicit-function-return-type (1) | 2024.03.12 |
10년 이상 시니어가 주니어의 PR 리뷰시 자주 피드백하는 것들 (1) | 2023.12.31 |
shopify가 만든 Liquid를 알아보자 (0) | 2023.12.30 |
mysql 새로운 컬럼 추가할때도 table lock 걱정하지마세요 (0) | 2023.07.13 |
- Total
- Today
- Yesterday
- CSS
- JavaScript
- 어플리케이션
- 자바스크립트
- 아이폰
- 모바일
- AWS
- iPhone
- 대학생
- 애플
- php
- 안드로이드
- 아이디어
- 창업
- 웹표준
- android
- 네이버
- 앱
- 공모전
- 구글
- Apple
- 소프트웨어
- 앱스토어
- 스마트폰
- 트위터
- 벤처
- 게임
- 경진대회
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |