説明
apt-get update などのインデックス更新を別の RUN で行うと、Docker は以前の更新レイヤーを再利用できます。後のインストール命令だけを変更した場合、古いインデックスで処理され、失敗や予期しない結果につながる場合があります。
同じ RUN にまとめると、インストール命令の変更時に更新も実行されます。ただし RUN 全体はキャッシュされるため、新しい情報が必要な場合はビルドキャッシュの方針も確認してください。
想定される影響
- 古いインデックスによるダウンロード・インストール失敗で、デプロイが遅れる場合があります。
- キャッシュ状態の違いにより、インストール結果を追跡しにくくなる場合があります。
対処方法
- apt-get update && apt-get install ... のように、更新とインストールを同じ RUN にまとめてください。
- 新しい情報が必要な場合は対象レイヤーのキャッシュを更新し、再現性が必要ならベース、パッケージバージョン、リポジトリも管理してください。
- update の意味はパッケージ管理ツールによって異なります。インデックス更新とパッケージのアップグレードを区別し、不要なキャッシュは同じ RUN で削除してください。
例
既存の Ubuntu の例は、APT インデックス更新とインストールの順序だけを比較します。キャッシュ削除は省略しています。
変更前
dockerfile
FROM ubuntu:24.04
RUN apt-get update
RUN apt-get install -y curl
変更後
dockerfile
FROM ubuntu:24.04
RUN apt-get update \
&& apt-get install -y curl
補足:
- 変更前: 更新レイヤーが再利用されたまま、インストールだけが再実行される場合があります。
- 変更後: 更新とインストールをまとめて実行します。レイヤー全体のキャッシュ再利用やバージョン変動までなくなるわけではありません。