
Dockerfileのマルチステージビルドを使ってみた
はじめに
最近、Amazon AWS の ECS 環境に React をリリースするために Dockerfile を記載しました。
その際、マルチステージビルドを使用しましたので、備忘録として残しておきたいと思います。
マルチステージビルドとは?
マルチステージビルドとは、Dockerにおけるイメージ構築方法の1つで、1つのDockerfile内で複数のステージ(`FROM` を使用するところ)を定義できる機能です。
それぞれのステージで異なる作業環境を設定し、最終的に必要な成果物だけを本番用の軽量なイメージに構築する手法を指します。
本番環境用イメージの軽量化や、開発環境と本番環境の分離を簡単に実現できるため、現在ではよく使われる技術です。
実際に書いてみた
参考までにDockerfileを書き出します。
# 1つ目のFROMセクション(Build Stage)
FROM public.ecr.aws/docker/library/node:20.12
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build
# 2つ目のFROMセクション(Production Stage)
FROM public.ecr.aws/nginx/nginx:1.27.3-alpine3.20-slim
WORKDIR /usr/share/nginx/html
# "0"を使って1つ目のFROMからコピー
COPY --from=0 /app/dist .
npm run build
し、ビルドした結果をコピーするサンプルですので、コード量は大したことありません。
簡単に説明しますと、
1つ目のFROMセクション(1~6行目)でReactのソースをビルドし、ビルドした成果物が /app/dist に出力されます。
2つ目のFROMセクション(8~12行目)でビルドした /app/dist
以下のファイルを全て /usr/share/nginx/html
にコピーしています。
2つ目のセクションのみが起動するため、1つ目のセクションの情報は破棄されます。
おわりに
ソースコードや環境設定ファイルを公開することなく、ビルドした成果物のみを公開することができるため、イメージの軽量化とセキュリティの向上が見込まれます。
また、リリース時のデプロイ手順を減らすこともできとても便利です。
出典:https://docs.docker.com/build/building/multi-stage/