できない.dev

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 で強制削除する。

よくある原因

  1. 停止コンテナの残存: docker stop しただけで docker rm していない。
    停止コンテナもイメージを参照する
  2. 複数タグ: 1 つの image ID に app:latestapp:v1 のように複数タグが付き、一方から参照が残る
  3. 派生イメージ: FROM で参照する子イメージがあるとレイヤが共有され削除がブロックされる
  4. 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 公式)。

この記事は役立ちましたか?