マルチステージは、ノードでDockerでビルドします.js
Dockerは開発のための必然的なツールとなっている.日常の開発者はそれらのアプリケーションをコンテナ化するための新しい課題に直面する.重要な問題の一つは、さまざまな環境のためのアプリケーションを格納している.マルチステージは、ノードでDockerでビルドします.js
なぜ私たちはマルチステージでノードをビルドする必要があります.JSアプリケーション.なぜ、我々はただ一つのステージイメージを構築して、それをサーバーに配備することができませんか?
我々は、コンパイラとトランスポーターが重要な役割を果たす開発時代にあります.特にJavaScript開発環境で.例えば、TypeScript とBabel.
マルチステージの概念が構築される前に、アプリケーションは2つのdockfileを持ちます.一つは開発用で、もう一つは生産です.これはbuilder patternと呼ばれている.しかし、2つのdockerfileを維持することは理想的ではありません.
Dockerfile.dev
多段ビルドは、生産ビルドを作成するために異なる環境DockerFileを1つに結合します.たとえば、ステージングビルドは、コンパイルされたバージョンのアプリケーションソースコードを作成し、最終ビルドには、イメージコンテナーに配備されたコンパイル済みのバージョンが含まれます.
ノードのためのMUTIステージを構築する例を見てみましょう.バベルとMongoDBと一緒のJS.完全なソースは、このrepositoryで利用できます
ディレクトリを作成し、ExpressとBabelでアプリケーションを初期化します.
copy - from = 0行は、直前のステージからビルドしたアーティファクトを新しいステージにコピーします.
代わりに番号を使用してビルド段階を参照すると、それらを名前を付けることができます参照のために使用します.たとえば、stage buildを名前appbuild
以前のビルドを参照してください.
Dockerを作成します.YMLファイルを次のように追加します.
完全なソースコードは、このrepositoryで利用可能です
なぜ私たちはマルチステージでノードをビルドする必要があります.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
DockerfileFROM 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で利用可能です
Reference
この問題について(マルチステージは、ノードでDockerでビルドします.js), 我々は、より多くの情報をここで見つけました https://dev.to/ganeshmani/crafting-multi-stage-builds-with-docker-in-node-js-hkiテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol