できない.dev

Docker rmi で image is being used by container エラーを解決できない

docker rmi がイメージ削除で conflict: unable to delete を返すのは、停止中も含む既存コンテナや別タグから image が参照されているため。
コンテナを先に docker rm するか、docker rmi -f で強制削除する。

公開: 更新:

実行例あり(2026-08-26 に実環境で検証)

要約

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 run した後に docker rmi すると、conflict: unable to delete rmi-demo:latest (must be forced) - container 2a1e58b1eff3 is using its referenced image が返り、終了コードは 1 だった。docker ps -a --filter ancestor= で参照元をたどると Exited のコンテナが 1 つ残っており、それを docker rm してから同じ docker rmi を打つと Untagged と Deleted が出て終了コード 0 で消えている。

$ docker build --progress=plain --no-cache -t rmi-demo:latest .
#0 building with "desktop-linux" instance using docker driver
 
#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 77B done
#1 DONE 0.0s
 
#2 [internal] load metadata for docker.io/library/alpine:3
#2 DONE 0.0s
 
#3 [internal] load .dockerignore
#3 transferring context: 2B done
#3 DONE 0.0s
 
#4 [1/2] FROM docker.io/library/alpine:3@sha256:28bd5fe8b56d1bd048e5babf5b10710ebe0bae67db86916198a6eec434943f8b
#4 resolve docker.io/library/alpine:3@sha256:28bd5fe8b56d1bd048e5babf5b10710ebe0bae67db86916198a6eec434943f8b 0.0s done
#4 DONE 0.0s
 
#4 [1/2] FROM docker.io/library/alpine:3@sha256:28bd5fe8b56d1bd048e5babf5b10710ebe0bae67db86916198a6eec434943f8b
#4 CACHED
 
#5 [2/2] RUN echo demo > /demo.txt
#5 DONE 0.2s
 
#6 exporting to image
#6 exporting layers 0.0s done
#6 exporting manifest sha256:b1557b2419c8b464d9a55b48223c69dfc28b67abb3de97e82ec396d0828c6e51 done
#6 exporting config sha256:b7a7d0499c5c44fb4502b12a7ba497e8e2621ac99ce12e1573d98abf0fc9728b done
#6 exporting attestation manifest sha256:ac6b42ce772aa84cca03cb56082c460fa47d2782fa77269cf2e16debe70a53fd 0.0s done
#6 exporting manifest list sha256:4928695c073fd1ba1e8a787053a390c4cbccdde9ffb8f7b8506ed30bab5eec9b done
#6 naming to docker.io/library/rmi-demo:latest done
#6 unpacking to docker.io/library/rmi-demo:latest 0.0s done
#6 DONE 0.1s
$ docker run --name rmi-demo-c rmi-demo:latest cat /demo.txt
demo
$ docker rmi rmi-demo:latest
Error response from daemon: conflict: unable to delete rmi-demo:latest (must be forced) - container 2a1e58b1eff3 is using its referenced image 4928695c073f
$ echo $?
1
$ docker ps -a --filter ancestor=rmi-demo:latest
CONTAINER ID   IMAGE             COMMAND           CREATED         STATUS                              PORTS     NAMES
2a1e58b1eff3   rmi-demo:latest   "cat /demo.txt"   2 seconds ago   Exited (0) Less than a second ago             rmi-demo-c
$ docker rm rmi-demo-c
rmi-demo-c
$ docker rmi rmi-demo:latest
Untagged: rmi-demo:latest
Deleted: sha256:4928695c073fd1ba1e8a787053a390c4cbccdde9ffb8f7b8506ed30bab5eec9b
$ echo $?
0

— 2026-08-26 時点の出力

検証環境

検証日
実行環境
local host (Windows 11 Home, Docker 29.1.3)
バージョン
  • Node.js 22.14.0
  • npm 10.9.2
  • Git 2.48.1.windows.1
  • Docker 29.1.3

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

よくある原因

  1. 停止コンテナの残存: docker stop しただけで docker rm していない。
    停止コンテナもイメージを参照する
  2. 複数タグ: 1 つの image ID に app:latest と app: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 公式(新しいタブで開く))。

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