Node.js에서 Docker로 다단계 빌드 제작

Docker는 개발을 위한 필수 도구가 되었습니다. 일상적인 개발자는 애플리케이션을 컨테이너화하는 데 있어 새로운 과제에 직면합니다. 중요한 문제 중 하나는 다양한 환경에 맞게 애플리케이션을 컨테이너화하는 것입니다. 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에서 사용할 수 있습니다.

좋은 웹페이지 즐겨찾기