これは何?
- Dockerfileでの命令の記載順によってビルド時間が変わる。
- 典型的な例としてPythonのpip installの実行タイミングがある。
- この記事では、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は以下のプロセスでキャッシュを活用します
- 各命令を順番に実行します。
- 命令とその入力(例:コピーされるファイル)が前回のビルドと同じであれば、キャッシュされたレイヤーを再利用します。
- 変更が検出されたレイヤー以降は、すべて再ビルドされます。
pip installの実行タイミングの話
requirements.txt
ファイルを先にコピーし、その後にpip install
を実行することで、依存関係のインストールとソースコードのコピーを分離しています。これによりソースコードが変更された場合でも、依存関係が変更されていなければ、キャッシュされたレイヤーが利用される。これにより、ビルド時間を短縮できる。
まとめ
Dockerfileはレイヤーキャッシュを利用できるように記載し、ビルド時間を短く抑えるようにしましょう。