概要
docker ビルドをした際に「更新したはずのファイルがコンテナ上に反映されない」と苦しむことがあります。これは Dockerfile の COPY
や ADD
などでホストマシンのファイルをコンテナ上にコピーする際に、docker のビルドキャッシュが効いてしまって更新が反映されない現象です。
通常は docker compose build --no-cache
でビルドし直せばいいのですが、これだけでは消えてくれないやっかいな場合があります。
docker のビルドキャッシュについて
docker はビルドの各ステップをキャッシュしており、Dockerfile の命令に変更がない場合、キャッシュされたレイヤーを再利用します。これによりビルド時間を短縮できる一方で、ファイルの内容が変更されていても、Dockerfile の命令自体が変わらないとキャッシュが再利用され、変更が反映されないことがあります。
docker のビルドキャッシュをクリアする方法
自分は以下の手順でやっています。
# まず docker コンテナを落とす
docker compose down
# docker のビルドキャッシュを消す
docker builder prune --all
# 念のため --no-cache でビルドしなおす
docker compose build --no-cache
# docker コンテナを立ち上げる
docker compose up -d
最強の魔法
上記の方法でビルドキャッシュは消せるはずですが、その他のキャッシュが効いて上手く反映されないこともあるかもしれません。「もう面倒臭いから全てのキャッシュを吹き飛ばしたい!」という方は以下を唱えてください。
docker system prune -a
これは以下のものを削除するので注意してください。
- 停止しているコンテナ
- どのコンテナも使用していないネットワーク
- 使われていないイメージ
- ビルドキャッシュ
- 使われていないボリューム
自分はイライラしてたまにこのコマンドを実行するのですが 5GB くらいスペースが空くので気持ちが良いです。