Docker rmi で image is being used by container エラーを解決できない
`docker rmi` がイメージ削除で `conflict: unable to delete` を返すのは、停止中も含む既存コンテナや別タグから image が参照されているため。
コンテナを先に `docker rm` するか、`docker rmi -f` で強制削除する。
#rmi#image#container#conflict#cleanup
公開:
要約
Error response from daemon: conflict: unable to delete <id> (must be forced) - image is being used by stopped container <cid> の本質は 参照しているコンテナがまだ存在する こと。
コンテナを docker rm で消してから docker rmi、もしくは docker rmi -f で強制削除する。
よくある原因
- 停止コンテナの残存:
docker stopしただけでdocker rmしていない。
停止コンテナもイメージを参照する - 複数タグ: 1 つの image ID に
app:latestとapp:v1のように複数タグが付き、一方から参照が残る - 派生イメージ:
FROMで参照する子イメージがあるとレイヤが共有され削除がブロックされる - Compose 残骸:
docker compose downを呼ばずにstopで終え、サービスコンテナが残っている
解決策
1. 参照中コンテナを特定して削除
docker ps -a --filter ancestor=<image-name-or-id>
docker rm <container-id>
docker rmi <image-name-or-id>-a で停止コンテナまで列挙する点が重要。
2. 強制削除(-f)
docker rmi -f <image-name-or-id>-f はタグを外すだけで、コンテナが参照中の共有レイヤ自体は残る。
実体は消えないので「容量が戻らない」と感じることがある(公式 docker image rm 参照)。
3. 複数タグを確認して全削除
docker image inspect <image> --format '{{.RepoTags}}'
docker rmi app:latest app:v1タグごとに削除しないと、最後のタグが消えるまで実体は残る。
4. Compose の一括クリーンアップ
docker compose down --rmi all --volumesサービスコンテナ・ネットワーク・関連イメージ・volume をまとめて消す。docker compose down だけだとイメージは残る。
5. 未使用全体を掃除
docker system prune -a --volumes-a は未使用イメージも対象、--volumes で匿名 volume まで掃除する。
CI のディスク逼迫対策にも有効(docker system prune 公式)。