aobako.net
マルチステージビルドがいい感じ
July 17, 2020
Dockerイメージを作るときに,今まであれこれ工夫をしてサイズの削減に努めていた.
RUN
コマンドをまとめてレイヤーを削減- ビルド用のパッケージのキャッシュをしない
- ビルド後にパッケージを削除
など.
マルチステージビルドでビルド用のイメージとランタイム用のイメージを分割することで,前述の工夫は不要になる.
個人的には,次のように3段階でビルドするのがオススメ (python の例).
FROM hoge as base
# 引数を処理したり
# 環境変数をセットしたり
# WORKDIR をセットしたり
FROM base as builder
# ビルド用パッケージのインストール
# 仮想環境の作成
# 仮想環境にアプリの依存関係をインストール
FROM base as runtime
# builder イメージから仮想環境をまるまるコピー
# その他必要なファイルがあればとってくる
# アプリケーションの実行コマンドとか
場合によりけりだが,自分の場合はこれでイメージサイズが従来の半分以下になった.CircleCI で回したり,イメージをどこかのリポジトリにプッシュする必要がある場合,微妙にパフォーマンスの向上が期待できる.