Dockerfile での pip install のビルド時間削減方法とレイヤーキャッシュの活用

これは何?

  1. Dockerfileでの命令の記載順によってビルド時間が変わる。
  2. 典型的な例としてPythonのpip installの実行タイミングがある。
  3. この記事では、pip installのbuild cacheを使用する(短時間でbuildを完了する)ための書き方と、その理由についてまとめる。

まず結論

以下のような書き方にすると良い。
Dockerfileと同じディレクトリにapp.py, requirements.txt等が配置されている想定。

Dockerfile
FROM python:3.12

WORKDIR /app

# requirements.txtをコピー
COPY requirements.txt .

# pip installを実行
RUN pip install --no-cache-dir -r requirements.txt

# アプリケーションのソースコードをコピー
COPY . .

CMD ["python", "app.py"]

なぜこの書き方が良いのか?

Dockerの以下公式ドキュメント以上のことは説明しないので、こちらを把握されている方には無用かもしれません。

レイヤーキャッシュの基本原理

Dockerイメージは一連のレイヤーから構成されており、各レイヤーはDockerfileの各命令に対応している。ビルド時、Dockerは以下のプロセスでキャッシュを活用します

  1. 各命令を順番に実行します。
  2. 命令とその入力(例:コピーされるファイル)が前回のビルドと同じであれば、キャッシュされたレイヤーを再利用します。
  3. 変更が検出されたレイヤー以降は、すべて再ビルドされます。

pip installの実行タイミングの話

requirements.txtファイルを先にコピーし、その後にpip installを実行することで、依存関係のインストールとソースコードのコピーを分離しています。これによりソースコードが変更された場合でも、依存関係が変更されていなければ、キャッシュされたレイヤーが利用される。これにより、ビルド時間を短縮できる。

まとめ

Dockerfileはレイヤーキャッシュを利用できるように記載し、ビルド時間を短く抑えるようにしましょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


This site uses Akismet to reduce spam. Learn how your comment data is processed.