Docker错误:无法删除Docker容器,冲突:无法删除存储库引用。

268

我想在Docker中删除容器,但在尝试删除时出现错误。

在删除容器之前,我的下一步是查看现有容器列表。

sts@Yudi:~/docker$ sudo docker ps -as

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES                  SIZE
78479ffeba5c        ubuntu              "/bin/bash"         42 hours ago        Exited (0) 42 hours ago                       sharp_wescoff          81 B (virtual 187.7 MB)
0bd2b54678c7        training/webapp     "python app.py"     5 days ago          Exited (0) 5 days ago                         backstabbing_ritchie   0 B (virtual 323.7 MB)
0adbc74a3803        training/webapp     "python app.py"     5 days ago          Exited (143) 5 days ago                       drunk_feynman          0 B (virtual 323.7 MB)

我想删除列表中的一个项目,即"training / webapp",但出现了一个错误

sts@Yudi:~/docker$ sudo docker rmi training/webapp
Error response from daemon: conflict: unable to remove repository reference "training/webapp" (must force) - container 0bd2b54678c7 is using its referenced image 54bb4e8718e8
Error: failed to remove images: [training/webapp]

容器是否正在镜像中运行?

请帮忙。

12个回答

304

Docker 镜像和容器是有区别的。可以参考这个 SO 问题

简单来说,容器是一个镜像的可运行实例。这也就是为什么如果有一个基于该镜像的运行中的容器,你就不能删除该镜像。 你只需先删除容器。

docker ps -a                # Lists containers (and tells you which images they are spun from)

docker images               # Lists images 

docker rm <container_id>    # Removes a stopped container

docker rm -f <container_id> # Forces the removal of a running container (uses SIGKILL)

docker rmi <image_id>       # Removes an image 
                            # Will fail if there is a running instance of that image i.e. container

docker rmi -f <image_id>    # Forces removal of image even if it is referenced in multiple repositories, 
                            # i.e. same image id given multiple names/tags 
                            # Will still fail if there is a docker container referencing image

Docker 1.13+更新[自2017年1月起]

在Docker 1.13中,我们重新分组了每个命令以便与其交互的逻辑对象相对应。

基本上,以上命令也可以更明确地重写为:

docker container ls -a
docker image ls
docker container rm <container_id>
docker image rm <image_id>

同样地,如果你想要删除全部内容,你可以使用:

docker system prune -a

警告!这将删除:

  • 所有已停止的容器
  • 至少没有一个容器使用的所有网络
  • 所有未使用的镜像
  • 所有构建缓存

7
最终我不得不使用docker rmi -f id来“强制”删除。 - WernerCD
1
值得注意的是,docker container ls仅列出正在运行的容器。这让我感到困惑,直到我意识到添加-a标志可以列出所有容器。 - MFB
1
@MahdiAmrollahi 您可以随时使用 docker rm <container_id> 命令删除已停止的容器。如果容器仍在运行,请先停止它,或使用 docker rm -f <container_id> 强制删除。 - Ahmad Abdelghany
1
现在我想起来,“运行实例”这个术语并不是很准确,因为容器有自己的生命周期(即可以启动/停止)。我将使用“可运行实例”这个术语。 - Ahmad Abdelghany
docker system prune -a 对我来说解决了问题!!!谢谢 - Zorox
显示剩余4条评论

100

首先,删除容器名称

$ sudo docker rm backstabbing_ritchie

结果

$ sudo docker rm backstabbing_ritchie
  backstabbing_ritchie

删除第二部分,该部分列在要删除的容器上。

$ sudo docker rm drunk_feynman 
  drunk_feynman

其次,移除容器

$ sudo docker rmi training/webapp

结果

$ sudo docker rmi training/webapp  
  Untagged: training/webapp:latest
  Deleted: 54bb4e8718e8600d78a5d7c62208c2f13c8caf0e4fe73d2bc0e474e93659c0b5
  Deleted: f74dd040041eb4c032d3025fe38ea85de8075992bdce6789b694a44b20feb8de
  Deleted: 7cbae69141977b99c44dc6957b032ad50c1379124d62b7d7d05ab7329b42348e
  Deleted: abb991a4ed5e4cde2d9964aec4cccbe0015ba9cc9838b696e7a32e1ddf4a49bd
  Deleted: 1952e3bf3d7e8e6a9b1e23bd4142e3c42ff7f4b7925122189704323593fd54ac
  Deleted: f95ebd363bf27a7546deced7a41a4099334e37a3d2901fa3817e62bb1ade183f
  Deleted: 20dd0c75901396d41a7b64d551ff04952084cc3947e66c67bae35759c80da338
  Deleted: 2505b734adda3720799dde5004302f5edb3f2a2ff71438f6488b530b728ba666
  Deleted: 2ee0b8f351f753f78f1178000ae37616eb5bf241d4ef041b612d58e1fd2aefdc
  Deleted: 2ce633e3e9c9bd9e8fe7ade5984d7656ec3fc3994f05a97d5490190ef95bce8d
  Deleted: 98b15185dba7f85308eb0e21196956bba653cf142b36dc08059b3468a01bf35d
  Deleted: 515565c29c940355ec886c992231c6019a6cffa17ff1d2abdfc844867c9080c5
  Deleted: 2880a3395eded9b748c94d27767e1e202f8d7cb06f1e40e18d1b1c77687aef77

检查容器

  $ sudo docker ps -as
  CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES                  SIZE
  78479ffeba5c        ubuntu              "/bin/bash"         43 hours ago        Exited (0) 43 hours ago                       sharp_wescoff          81 B (virtual 187.7 MB)

6
如果您手头有很多旧容器,可以考虑使用Docker rm \docker ps -aq`` 进行清理,而不是逐个删除它们。更多信息请参见此处 - Philiiiiiipp
为什么在删除图像之前需要先删除名称?如果不先删除名称就尝试删除图像会有什么问题? - code_dredd
@code_dredd 没有所谓的“删除名称”。在删除图像之前,必须先删除容器。更多详细信息请参见 https://dev59.com/g1sX5IYBdhLWcg3wW-f-#40283776 - Ahmad Abdelghany

51

如果您想清理Docker镜像和容器

注意:这将清空所有内容

停止所有容器

docker stop $(docker ps -a -q)

移除所有容器

docker rm $(docker ps -a -q)

删除所有图片

docker rmi -f $(docker images -a -q)

那个有效。另外,如果你停止容器,你仍然会在列表中看到它。因此,你必须使用 docker rm $(docker ps -a -q) 命令将其删除。谢谢! - user6123563

39

您可以使用-f选项来强制删除容器。

sudo docker rmi -f training/webapp

在删除之前,您可以使用sudo docker stop training/webapp停止容器。


1
我已经尝试了,通过停止容器$ sudo docker stop training/webapp 守护程序的错误响应:没有此ID:training/webapp 错误:无法停止容器:[training/webapp] - Yuday
你可以尝试使用容器ID sudo docker stop 0bd2b54678c7 来停止容器。 - Saril Sudhakaran

23
如果您已经启动了多个 Docker 容器,请使用以下命令: $ docker rm $(docker ps -aq) 它将删除在 "ps -aq" 命令中列出的所有当前 Docker 容器。
来源:aaam 在 https://github.com/docker/docker/issues/12487

这对我有用。在运行此命令后,我需要运行 docker image ls 然后运行 docker image rm X,其中每个 X 都是从 ls 输出中获取的。 - jftuga

12

1-停止运行容器:

docker stop <container-id>

2-移除容器

docker rm <container-id>

3-删除Docker镜像

docker rmi <image-id>

这就是它。非常简单 :) 一个人可以使用命令 =“docker ps -a”来列出容器ID,“docker images”命令来查看Docker镜像列表。引号只是表示命令,运行命令时不要包括它们。 - Badri Paudel

8

列出所有 Docker 镜像:

docker images

列出所有已存在的Docker容器:
docker ps -a

删除所有正在使用你想要删除的镜像的容器:

docker rm <container-id>

删除指定的图像:

docker rmi <image-name:image-tag or image-id>

5
我注意到这是一个两年前的问题,但仍然想分享我的解决方法:

首先,运行 docker container ls -a 来列出您拥有的所有容器,并定位要删除的容器。

其次,使用命令 docker container rm <CONTAINER ID> 删除该容器(如果容器当前正在运行,则应首先停止它,运行docker container stop <CONTAINER ID> 以优雅地停止指定的容器,如果由于某种原因它无法停止,则可以运行docker container kill <CONTAINER ID> 强制关闭指定的容器)。

第三步,运行 docker container rm <CONTAINER ID> 来删除容器。

最后,您可以通过运行 docker image ls -a 来查看所有图像,并通过运行docker image rm <hash>来删除您想要的图像。

3

删除Docker中的“network not found”

检查无法删除的网络

docker network inspect [<id> or <name>]

断开网络连接

docker network disconnect -f [<networkID> or <networkName>] [<endpointName> or <endpointId>]

删除未使用的网络

docker network prune

2

仅需这两个命令即可解决我的问题。

停止特定的容器。

docker stop <container_id>

即使图像被多个存储库引用,也强制删除该图像。

docker rmi -f <container_id>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接