사전학습에서 배운 docker 이미지 최적화 전략을 활용, builder
, runner
로 스테이지를 구분 후
필요한 데이터(dist, 의존성)만 builder에서 runner로 옮긴 후 이미지를 만들고 실행하도록 구성해보았다.
FROM node:20-alpine AS builder
WORKDIR /app
ADD . /app
RUN SHARP_IGNORE_GLOBAL_LIBVIPS=1 npm_config_arch=x64 npm_config_platform=linux yarn workspace server add sharp@0.32.6
RUN yarn workspace server build
FROM node:20-alpine AS runner
WORKDIR /app
COPY --from=builder /app/packages/server/dist /app/packages/server/dist
COPY --from=builder /app/packages/server/package.json /app/packages/server/package.json
COPY --from=builder /app/.yarn /app/.yarn
COPY --from=builder /app/.pnp.cjs /app/.pnp.cjs
COPY --from=builder /app/.yarnrc.yml /app/.yarnrc.yml
COPY --from=builder /app/yarn.lock /app/yarn.lock
COPY --from=builder /app/package.json /app/package.json
EXPOSE 3000
ENTRYPOINT ["yarn", "workspace", "server", "start:prod"]
추가로 고려해줘야 했던 사항은 모노레포에 yarn berry를 사용하기 때문에, 정상적으로 실행되게 하기 위해
node_modules 대신 .yarn 폴더를, 그리고 packges/server 폴더 구조를 그대로 유지한 채로 옮겨줘야 한다는 것 등이였다.
docker build -t qkrwogk/web16-b1g1-be:week5-test1 -f ./Dockerfile-was . --platform linux/amd64
에러 없이 빌드되며, build, push 속도도 훠어어어~얼씬 더 빨랐다 ㅋ 진즉 해야했다..
docker push qkrwogk/web16-b1g1-be:week5-test1
사진에서도 확인할 수 있지만 용량이 두 배 가까이 차이난다.
배포 환경에서 예정대로 잘 실행되는지 테스트해보자.
실행중인 컨테이너를 확인해보니 페어 분이 GitHub Actions를 거치지않고 핫픽스한 컨테이너를 직접 배포해 놓으신 것 같아서,
문제 생길 수 있으니 그냥 컨테이너 하나 더 띄워서 3001번 포트로 열고 정상 실행되는지만 확인해보기로 했다.
docker pull qkrwogk/web16-b1g1-be:week5-test1
pull도 아주그냥 훨씬 빠름 ㅋ
docker run -d -p 3001:3000 --env-file ./.env2 qkrwogk/web16-b1g1-be:week5-test1
에러 없이 잘 올라가는 것 확인했고
ACG에서 3001번 임시 허용
아주 잘 실행된다. 성공성공!!