はじめに
もう6月も終わり!?光陰矢の如しすぎない!? nikkieです。
PythonプロジェクトのDockerイメージのマルチステージビルドについて、現時点の理解をまとめます。
目次
マルチステージビルド
Dockerのドキュメントを参照します1。
1つのDockerfileの中に複数のFROMを書きます!
各FROM命令のベースイメージは、それぞれに異なるものとなり、各命令から新しいビルドステージが開始されます。
イメージ内に生成された内容を選び出して、一方から他方にコピーすることができます。
そして最終イメージに含めたくない内容は、放っておくことができます。
ドキュメントの例では
となっています。
ビルドツールは最終的にできあがるイメージには不要であり、ビルドツールによる成果物だけを1つ目のステージから2つ目のステージにCOPY
することで、最終的にできあがるイメージを最小限の要素で作れています。
この書き方は、Docker Engine 17.05からサポートされました。
私がマルチステージビルドに関心を持っている理由は、サイズが小さいイメージは取り回ししやすいからです。
Pythonでマルチステージビルドの例
『エキスパートPythonプログラミング 改訂3版』の2章(2.5.2内の「訳者より」)に例があります。
翻訳者の1人の澁川さんの執筆記事も紹介されています。
- ビルド用のコンテナで依存関係をすべてインストール(
pip install -r requirements.lock
) - 実行用のコンテナに
site-packages
以下をコピーCOPY --from=builder /usr/local/lib/python3.8/site-packages /usr/local/lib/python3.8/site-packages
- コマンドとしても使えるパッケージが含まれる場合は、
/usr/local/bin/
以下のコマンドもコピーする
- 実行用のコンテナにソースコードもコピー
上記の方法(site-packages
以下をCOPY
)を試し始めたところ、なかなかいい感じです。
nikkieのプロジェクトでの例
直近でマルチステージビルドした例(この記事のきっかけ)はこちらです。
#かがみの孤城 のみんなのパラレルワールドの曜日を表示するコマンド kojo-day 、
— nikkie にっきー (@ftnext) 2023年6月28日
pip install kojo-fan-art でお試しできますが
Dockerイメージでも使えるようにしたよ〜https://t.co/npCp5DDHd7
Let's docker run ftnext/kojo-day pic.twitter.com/D5538dPJzn
関連情報
Poetryでの例
Poetryを使った場合もsite-packages
以下をCOPY
するマルチステージビルドができそうに思います。
見つけた例はこちら:
site-packages
以下をCOPY
するためにPoetryで仮想環境は作らない(POETRY_VIRTUALENVS_CREATE=false
)- この記事では既存の記事では解決できない問題3つにアプローチするために工夫しています
- 今の私には
site-packages
以下をCOPY
するための工夫が知れただけで十分でした
- 今の私には
pip install --no-cache-dir
サイズの小さなDockerイメージをbuildする方法として、キャッシュを削除する目的でpip install --no-cache-dir
が紹介されることがあります。
私は--no-cache-dir
というオプションが何を指定しているのかすごく分かりづらいな〜と思います2。
# pip 23.1.2 で pip install --help --no-cache-dir Disable the cache.
(実験したところ両方ともやってそうな感じでしたが(※勘違いしてるかも)、時間を作ってソースコードを読むしかないかな〜と思っています)
マルチステージビルドを使うことで、--no-cache-dir
に認識していた煩雑さからは解放されました。
終わりに
PythonプロジェクトのDockerイメージビルドについて、マルチステージビルドでsite-packagesをCOPYする方法をアウトプットしました。
この結論はあくまで現時点のもので、今後経験を重ねる中で別の方法にシフトする可能性もあります。
この記事を書く中で思い出したのですが、初めてみんなのPython勉強会本編で話したときもDockerでしたね。
Entrance of Docker for Pythonista 〜Dockerではじめる機械学習モデルのデプロイ〜
長い付き合いになったものだ〜
- 英語 ↩
-
ドキュメント https://pip.pypa.io/en/stable/cli/pip_install/ に
--no-cache-dir
の説明は見つかりませんでした↩