<aside> 💡
</aside>
pnpm-lock.yaml
, package.json
파일등 모든 파일들을 다 호스트 폴더에서 카피해와서 각 이미지에서 또 설치한 후에 배포해야했던 거죠.이미지레이어
라는 기법이 존재한다고는 하는데, 아직 거기까지는 학습하지 못해서 시도해보진 못했습니다.pnpm fetch
명령어가 있는데, 이는 root폴더의 pnpm-lock.yaml
파일을 기반으로 필요한 의존성 파일들을 사전에 미리 캐시시켜둡니다.frontend-build docker
, backend docker
이미지는 base 이미지를 바탕으로 캐시에 저장되어있는 의존성 정보들을 설치하고 사용합니다.
frontend-build docker
이미지는 정적 파일(dist폴더)을 빌드하는 용도로 사용됩니다.
frontend-build docker
이미지에서 만들어진 정적 파일은 frontend docker
이미지에서 해당 dist 폴더 경로 내 파일들만 copy해와 배포합니다.forntend docker
파일은 의존성 파일들을 설치해오지 않고, dist 폴더 경로 내 정적 파일들만 가져와 배포를 하니 배포이미지의 크기가 축소되는 것이죠.backend docker
는 정적배포가 불가능합니다. frontend docker
파일처럼 multi-stage
기법으로 실제 컨테이너로 배포하는 이미지의 크기는 줄이고 싶었는데, 동적으로 의존성들을 사용해야하는 경우가 생기기 때문에 일단은 의존성들이 다 설치되어있는 backend docker
이미지 자체를 바로 컨테이너로 올렸습니다.
FROM node:20-alpine AS base
# docker 이미지가 node 20.x 버전이 설치되어있는 환경을 바탕으로 실행됩니다.
# alpine은 이미지 크기를 줄이기 위한 경량화 버전입니다.
# 이미지 이름은 base로 설정됩니다.
WORKDIR /app
# base docker 이미지(환경)에 app 디렉토리를 만들어 해당 디렉토리로 경로를 이동합니다.
# 이 app 디렉토리가 일종의 저희 프로젝트 폴더 역할이 되는 것입니다.
COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./
# 호스트 서버의 root 폴더 경로에 있는 의존성 설치 관련 파일들을 app/ 디렉토리 하위에 복사시킵니다.
RUN npm install -g pnpm
RUN pnpm fetch
# docker 환경 내에선 pnpm 패키지 매니저가 설치되어있지 않으니, pnpm 패키지 매니저를 설치하고
# pnpm fetch 명령어로 캐시에 의존성 정보들을 캐시해둡니다.
COPY packages ./packages
# 공통적으로 사용되는 packages폴더는 이미지내부에서도 호스트처럼 똑같이 packages 폴더를 만들어 그 하위에 복사해둡니다.
pnpm fetch
명령어는 pnpm-lock.yaml
파일을 기반으로 필요한 의존성 파일들을 사전에 미리 캐시해둡니다.pnpm install --offline
을 통해 p**npm fetch
명령어로 만들어지는 캐시정보를 가지고 의존성 파일들을 빠르게 실행**할 수 있게 합니다.pnpm-lock.yaml pnpm-workspace.yaml package.json
만 먼저 복사하고, 이후 packages
폴더를 복사하는데 그 이유는 캐시때문입니다.
packages
또한 변경사항이 있으면 해당 코드라인부터 이미지를 재빌드합니다.