Node.js에서 Docker로 다단계 빌드 제작
node.js 애플리케이션에서 다단계 빌드가 필요한 이유는 무엇입니까? 단일 단계 이미지를 빌드하고 서버에 배포할 수 없는 이유는 무엇입니까?.
우리는 Compiler와 Transpiler가 중요한 역할을 하는 개발 시대에 있습니다. 특히, 자바스크립트 개발 환경에서. 예를 들어, TypeScript 및 Babel .
다단계 빌드 전
다단계 빌드 개념 이전에는 애플리케이션에 두 개의 Dockerfile이 있습니다. 하나는 개발용이고 다른 하나는 생산용입니다. 이것을 builder pattern이라고 합니다. 그러나 두 개의 Dockerfile을 유지하는 것은 이상적이지 않습니다.
Dockerfile.dev
FROM node:10.15.2-alpine
WORKDIR /usr/src/app
COPY package.json ./
RUN npm install
COPY . .
RUN npm run dev
도커파일
FROM node:10.15.2-alpine
WORKDIR /usr/src/app
COPY package.json ./
RUN npm install
COPY /usr/src/app/dist ./dist
EXPOSE 4002
CMD npm start
그러나 개발 및 프로덕션 이미지 빌드 문제를 해결합니다. 이는 장기적으로 비용이 많이 들며 로컬 디스크에서도 많은 공간을 차지합니다.
다단계 빌드 사용
다단계 빌드는 서로 다른 환경의 Dockerfile을 하나로 결합하여 프로덕션 빌드를 생성합니다. 예를 들어 스테이징 빌드는 애플리케이션 소스 코드의 컴파일된 버전을 생성하고 최종 빌드에는 이미지 컨테이너에 배포된 컴파일된 버전이 포함됩니다.
babel과 MongoDB로 Node.js를 위한 다단계 빌드 예제를 살펴보겠습니다. 전체 소스는 여기repository에서 사용할 수 있습니다.
Express 및 Babel 을 사용하여 디렉토리를 만들고 응용 프로그램을 초기화합니다.
스테이징 빌드
FROM node:10.15.2-alpine
WORKDIR /usr/src/app
COPY package.json ./
COPY .babelrc ./
RUN npm install
COPY ./src ./src
RUN npm run build
위 명령은 node:10.15.2-alpine을 기본 이미지로 사용하고 babel 구성과 함께 모든 소스 코드를 복사합니다. 컴파일된 코드를 빌드하고 컨테이너의 dist 폴더에 저장합니다.
최종 빌드
FROM node:10.15.2-alpine
WORKDIR /usr/src/app
COPY package.json ./
COPY .babelrc ./
RUN npm install
COPY --from=0 /usr/src/app/dist ./dist
EXPOSE 4002
CMD npm start
이 명령은 이전 스테이징 빌드에서 컴파일된 버전을 가져와 새 이미지 컨테이너에 저장합니다. 마법은 COPY --from=0 줄에서 발생합니다.
COPY --from=0 행은 이전 단계의 빌드 아티팩트만 새 단계로 복사합니다.
빌드 단계 이름 지정
빌드 단계를 번호로 참조하는 대신 이름을 지정하고 참조용으로 사용할 수 있습니다. 예를 들어, appbuild라는 이름으로 단계 빌드를 지정합니다.
스테이징 Docker 빌드
FROM node:10.15.2-alpine AS appbuild
WORKDIR /usr/src/app
COPY package.json ./
COPY .babelrc ./
RUN npm install
COPY ./src ./src
RUN npm run build
최종 도커 빌드
COPY --from=appbuild로 이전 빌드를 참조합니다.
FROM node:10.15.2-alpine
WORKDIR /usr/src/app
COPY package.json ./
COPY .babelrc ./
RUN npm install
COPY --from=appbuild /usr/src/app/dist ./dist
EXPOSE 4002
CMD npm start
완전한 Dockerfile
# Build Stage 1
# This build created a staging docker image
#
FROM node:10.15.2-alpine AS appbuild
WORKDIR /usr/src/app
COPY package.json ./
COPY .babelrc ./
RUN npm install
COPY ./src ./src
RUN npm run build
# Build Stage 2
# This build takes the production build from staging build
#
FROM node:10.15.2-alpine
WORKDIR /usr/src/app
COPY package.json ./
COPY .babelrc ./
RUN npm install
COPY --from=appbuild /usr/src/app/dist ./dist
EXPOSE 4002
CMD npm start
일단 dockerfile을 완성합니다. 여러 컨테이너를 함께 연결하기 위해 docker compose를 만듭니다.
docker-compose.yml 파일을 만들고 다음을 추가합니다.
version: "3"
services:
app:
container_name: app
restart: always
build: .
environment:
- PORT=4002
ports:
- "4002:4002"
links:
- mongo
mongo:
container_name: mongo
image : mongo
volumes:
- ./data:/data/db
ports:
- "27017:27017"
그런 다음 다음 명령으로 docker compose를 실행합니다.
docker-compose up
도커가 중간 이미지를 빌드하고 이를 사용하여 최종 이미지를 빌드하는 것을 볼 수 있습니다. 최종 이미지를 빌드하면 Docker는 중간 이미지를 삭제합니다.
전체 소스 코드는 여기repository에서 사용할 수 있습니다.
Reference
이 문제에 관하여(Node.js에서 Docker로 다단계 빌드 제작), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ganeshmani/crafting-multi-stage-builds-with-docker-in-node-js-hki텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)