マルチステージは、ノードでDockerでビルドします.js


Dockerは開発のための必然的なツールとなっている.日常の開発者はそれらのアプリケーションをコンテナ化するための新しい課題に直面する.重要な問題の一つは、さまざまな環境のためのアプリケーションを格納している.マルチステージは、ノードでDockerでビルドします.js
なぜ私たちはマルチステージでノードをビルドする必要があります.JSアプリケーション.なぜ、我々はただ一つのステージイメージを構築して、それをサーバーに配備することができませんか?
我々は、コンパイラとトランスポーターが重要な役割を果たす開発時代にあります.特にJavaScript開発環境で.例えば、TypeScript Babel.

多段ビルド前


マルチステージの概念が構築される前に、アプリケーションは2つのdockfileを持ちます.一つは開発用で、もう一つは生産です.これはbuilder patternと呼ばれている.しかし、2つのdockerfileを維持することは理想的ではありません.
Dockerfile.dev
FROM node:10.15.2-alpine
WORKDIR /usr/src/app
COPY package.json ./
RUN npm install
COPY . .
RUN npm run dev
Dockerfile
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を1つに結合します.たとえば、ステージングビルドは、コンパイルされたバージョンのアプリケーションソースコードを作成し、最終ビルドには、イメージコンテナーに配備されたコンパイル済みのバージョンが含まれます.
ノードのためのMUTIステージを構築する例を見てみましょう.バベルとMongoDBと一緒の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
上記のコマンドは、ノードを10.10.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行は、直前のステージからビルドしたアーティファクトを新しいステージにコピーします.

ビルドステージの命名


代わりに番号を使用してビルド段階を参照すると、それらを名前を付けることができます参照のために使用します.たとえば、stage buildを名前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

最終Dockerビルド


以前のビルドを参照してください.
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の作成を作成します.
Dockerを作成します.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をコマンドで実行します.
docker-compose up
Dockerが中間画像をビルドし、最終的なビルドをビルドするのを見ることができます.一旦それが最終的なものを構築するならば、Dockerは中間のイメージを削除します.


完全なソースコードは、このrepositoryで利用可能です