<aside> ✏️
</aside>
FROM base-image AS frontend-build
WORKDIR /app/apps/client
COPY ./apps/client .
COPY --from=base-image /app/packages /app/packages
RUN pnpm install --offline --frozen-lockfile
RUN pnpm run build
FROM nginx:alpine AS frontend
COPY --from=frontend-build /app/apps/client/dist /usr/share/nginx/html
COPY /apps/client/nginx.conf /etc/nginx/conf.d/default.conf
COPY /apps/client/ssl /etc/nginx/ssl
RUN chmod -R 755 /usr/share/nginx/html
RUN chmod 644 /etc/nginx/ssl/fullchain.pem
RUN chmod 600 /etc/nginx/ssl/privkey.pem
RUN chown -R nginx:nginx /usr/share/nginx/html /etc/nginx/ssl
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
프론트엔드 Dockerfile을 보면 frontend-build 이미지에서는 종속성도 설치하고, 빌드파일도 만든다. ⇒ 종속성으로 인해 이미지 크기가 크다.
하지만 이후 단계인 frontend 이미지에서 frontend-build에서 만든 빌드파일만 가져오고, 이외의 nginx 실행을 위해 필요한 파일들만 로컬에서 복사한 뒤 해당 이미지를 최종적으로 실행한다.
⇒ 최종적으로 사용하는 frontend 이미지에는 종속성도 없고, FROM이 nginx이다 보니 node 기반도 아니고, 정적파일인 빌드파일만 가져와서 실행시키기 때문에 빌드 사이즈가 작다.
공식문서를 읽어보면 이전 단계의 이미지들을 사용하려면 --from=0
처럼 단계의 순서를 써줘도 되고 위의 코드처럼 FROM ... AS frontend-build
처럼 AS
를 사용하여 단계에 이름을 붙여 --from=frontend-build
같이 사용해도 된다.
FROM node
처럼 docker 이미지를 생성할 때 배경이 되는 이미지를 말한다. 보통 컨테이너 환경에서 실행되는 애플리케이션을 위한 운영 체제나 런타임 환경들의 기본 세팅이라고 생각하면 된다.alpine
이나 slim
같은 경량이미지가 존재해 경량이미지를 이용하여 이미지 사이즈를 줄일 수 있다.