マルチステージコンテナビルドでデプロイを効率化
アプリケーションをビルド環境ごと丸ごと配布すると、システムはすぐに巨大になります。これにはビルド環境やテスト環境も含まれます。配布に必要なファイルの抽出自体は問題ではありませんが、時間がかかります。
コンテナを使用すれば、このプロセスを自動化できます。
1つのファイル内で複数のコンテナを定義することが可能です。Node.jsでビルドされたJavaScriptベースのWebサイトが好例です。
例:
- Node.js: 約400〜600 MB
- Webサーバーnginx: 約20 MB
- Webサイト本体: 約2 MB
全体を1つのコンテナにすると600 MB以上になりますが、実際に本番で必要なのはnginxとWebサイトの約22 MBのみです。また、本番運用に不要なソフトウェアが含まれるため、セキュリティリスクも生じます。この解決策がマルチステージビルドです。
マルチステージビルドでは、1つのDockerfile内で複数のコンテナ(ステージ)を定義し、あるステージから次のステージへ必要な成果物だけをコピーします。
マルチステージDockerfileの例
Node.jsの例を続けます。最初のステージではNode.jsをビルドシステムとして使用し、Webサイトを構築します。2番目のステージではWebサーバー(nginx)を含め、ビルド後に最初のステージから必要なファイルのみをコピーします。
## ベースシステム ステージ1
## コミュニティ版Node.jsコンテナを使用
FROM node:8.11.3 as buildsystem
## Gitプロジェクトからソースを追加
COPY ./source /root/frontend
## Node.jsでフロントエンドをビルド
WORKDIR /root/frontend/
RUN npm install \
&& npm run build
#####################################################################
#####################################################################
## ベースシステム ステージ2
## コミュニティ版nginxコンテナを使用(Alpine Linuxベース)
FROM nginx:alpine
## ステージ1からビルド成果物をコピー
RUN mkdir -p /var/www/html/<MyApp>
COPY --from=buildsystem /root/frontend/dist/ /var/www/html/<MyApp>/
## nginx用デフォルト設定を追加
ADD default.conf /etc/nginx/conf.d/
## ポート公開
EXPOSE 80
## nginx起動
CMD ["nginx", "-g", "daemon off;"]
結果として、最小限のコンポーネントのみを含む小さなコンテナが得られます。nginxには非常に軽量なLinuxディストリビューションであるAlpineを使用しています。
もう1つの利点は、メンテナンス済みのコミュニティコンテナを2つ利用できるため、それらを自前で作成・維持する手間が不要なことです。システム更新時には、コミュニティコンテナを定期的に差し替えるだけで済みます。この一連の流れは、GitLabなどのパイプラインで完全に自動化できます。
産業技術
- Raspberry Pi、DHT11、ThingSpeakで作る初めてのIoTプロジェクト
- 科学的記数法での乗算と除算:マスターする
- インダストリー4.0の洞察:Bosch.IOのベレナ・マユントケ氏へのQ&A - IoT、自動化、未来の工場
- マイクロソフトが170億パラメータ言語モデル「Turing-NLG」発表、過去最大規模
- AI駆動ロードマップ:サプライチェーン企業のための戦略的ガイド
- スマートな調達:AIと人間の洞察(HI)を融合させる
- x86システム上での効率的なARMコンテナビルド
- マルチステージコンテナビルドでデプロイを効率化
- Docker上のNode-REDをマスター:エキスパートのヒントとベストプラクティス
- 効率的なコンテナクレーン:港湾とレールヤードでの精密な積み下ろし
- ビジネスリーダーとの信頼構築:適切なクラウドサービスの選択