即使没有运行容器,也无法删除图像

我的机器里有多个停止的容器和图像。
我想清理并移除所有的容器:
docker ps -a不返回任何值。
我运行 docker rmi $(docker images -q)删除缓存的图像,但我得到:

来自守护进程的错误响应: 冲突: 无法删除..。 (必须强制)-图像在多个存储库中引用

它说的是什么存储库?

85295 次浏览

You cannot remove images having multiple repositories without the force modifier, see Docker docs for more info.

docker images
REPOSITORY                   TAG      IMAGE ID            CREATED           SIZE
repository/image-name        tag      a8e6fa672e89        10 days ago         344MB
repository2/image-name       tag      a8e6fa672e89        10 days ago         344MB

If you want to do it manually, instead of using the image id to remove the images, you must remove the repository/tag that you don't need using image names:

docker rmi a8e6fa672e89
Error response from daemon: conflict: unable to delete a8e6fa672e89 (must be forced) - image is referenced in multiple repositories

Remove the repository/tag you don't need:

docker rmi repository/image-name:tag
Untagged: repository/image-name:tag
Untagged: repository/image-name:tag@sha256:64b5a02e2bb3ee4d4b7c0982e8e2e5eb68bdfd0fb096fce22b6c030dafb53a33

(Repeat last step until only one repository/tag remains) And now you will be able to remove the image:

docker rmi a8e6fa672e89
Untagged: repository2/image-name:tag
Deleted: sha256:a8e6fa672e89b399bd3ac52b96c031e6816a69191d1fd7e6a1839fd643e3c751
Deleted: sha256:9861dd7b5783217515f571fdcfa6729e1e38af3ae9c971026e5a317b12fc5905

If you use the -f flag and specify the image’s short or long ID, then rmi untags and removes all images that match the specified ID.

If you are sure you want to remove all your images, you can use this command:

docker images | awk '{print $1":"$2}' | egrep -E 'REPOSITORY|TAG' | xargs -n1 docker rmi

The "repositories" it is talking about is part of the first column of a docker images:

docker images
REPOSITORY                   TAG      IMAGE ID            CREATED           SIZE
repository/image-name        tag      a8e6fa672e89        10 days ago         344MB
repository2/image-name       tag      a8e6fa672e89        10 days ago         344MB

(I take the samples which Gabriel showed in his answer)

Here we have two repositories: "repository" and "repository2". As you also can see, both images have the same IMAGE ID.

A docker images -q lists all available IMAGE ID's. Thus if you want to remove an IMAGE ID which is referenced by two images you get the error that you have mentioned.

Solution: You can remove the image by its name instead of its ID:

docker rmi repository/image-name:tag

You can clean up all containers. First of all, you need to stop all containers with: docker stop $(docker ps -aq). Finally, remove all containers with: docker rm $(docker ps -aq). You can do it all in one command docker rm $(docker stop $(docker ps -aq)).

If you want to remove all containers data:

docker container prune
docker network prune
docker system prune
docker volume prune
docker builder prune
 docker rmi `docker images --format="\{\{.Repository}}:\{\{.Tag}}"`

to delete a single record : sudo docker rmi -f <image_name>

to delete all images:
sudo docker rmi -f $(sudo docker images -a -q)

The "-f" parameter is important

To remove a Docker image forcefully, which is referring to multiple repositories, just use the command:

sudo docker rmi -f image_id

Error response from daemon: conflict: unable to delete 3472c3b5350b (must be forced) - image is referenced in multiple repositories Error response from daemon: conflict: unable to delete 3472c3b5350b (must be forced) - image is referenced in multiple repositories

If this error is coming first untag the image and then it can be deleted. This can be done by using thee following command. docker rmi :<image_tag>

The underlying problem is that you are trying to remove the image, but the image is tagged as Tarun Banda wrote. So don't delete the image by its id, but by its tag. That will untag the image, and then delete it.

Here an example to cleanup old containers:

docker images | grep '3 weeks ago' | awk '{print $1 ":" $2}' | xargs -n 1 docker rmi