Docker rmi无法删除镜像,显示“no such id”。

63

我有很多图片。当我试图使用 docker rmi 命令删除它们时。

$ sudo docker rmi acd33a9490dc
Error response from daemon: No such id: 75ce1f6710bab109a7d7cbee056fa8a0c7fa913e81c88e2a55121149dda80ee9
2014/07/14 10:13:24 Error: failed to remove one or more images

无论我尝试删除哪个docker镜像,那个75ce1...的哈希值都是相同的。

目前,以下命令可以查看当前docker版本;然而,这些镜像中有一些从早期版本(0.6左右)就存在了。

$ sudo docker version
Client version: 1.0.1
Client API version: 1.12
Go version (client): go1.2.1
Git commit (client): 990021a
Server version: 1.0.1
Server API version: 1.12
Go version (server): go1.2.1
Git commit (server): 990021a

1
此问题似乎与错误报告有关,不是一个实际的问题,因此属于非主题范畴。 - creack
如果您尝试通过仓库名称:标签而不是镜像ID来删除,会发生相同的事情吗? - jchysk
请提供更详细的信息,例如 docker images --treedocker images -adocker ps -a。可能需要检查 /var/lib/docker/aufs/diff 来查看此 ID 的实际情况。 - Larry Cai
5
这个问题解决了吗?我也有同样的问题。 - bumpkin
不需要。我有其他的解决方案,这使得这个功能变得不那么必要了。 - Ben Clifford
irc freenode.net/#docker 或者 github.com/dotcloud/docker 是这类问题更好的讨论地点。 - creack
9个回答

70
在您的终端中输入:

docker ps -a

CONTAINER ID | IMAGE ......................NAMES

d25c0cd9725a |acd33a9490dc ................focused_einstein

您可以在“IMAGE”列中查看您的IMAGEID。获取CONTAINER ID并删除容器:

docker rm d25c0cd9725a

现在,您可以删除该图像:

docker rmi acd33a9490dc

9
如果您想要删除 所有 容器,可以使用以下快捷方式:docker rm -f $(docker ps -aq) - PJSCopeland
3
因此,您可以使用 docker rmi -f $(docker images -q) 删除所有镜像(在删除相应容器后)。 - Robin Winslow

19
如果您需要删除多个图片,则可以删除所有包含以下内容的容器:

sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}

现在您可以删除任何图片。


在 Git Bash 中使用 boot2docker,我必须运行以下命令:"docker ps -a -q | xargs -n 1 docker rm" - scottrudy
在OSX中,从我的Vagrant SSH开始,我需要先执行以下命令: "sudo docker ps -a -q | xargs -n 1 -I {} sudo docker stop {}". 之后,上述的删除命令就能够很好地工作了。谢谢! - AnneTheAgile

13

我认为这是预期的行为,而不是错误。这是因为您有未删除的容器。这些容器是该镜像的实例,这会阻止您删除该镜像。

步骤1 - 删除未使用的容器实例

jripoll的答案Andras Hatvani的答案都展示了列出并删除绑定到镜像的容器的方法。

请注意,后者将删除所有容器实例! 因此,如果有一个容器实例需要提交为新镜像,您应该先执行此操作

步骤2 - 删除不必要的镜像

在删除容器后,您将能够删除任何基于它们的镜像。

为了快速删除任何未标记的容器(在运行sudo docker images时显示为 ),您可以运行以下命令:
    sudo docker images -q --filter "dangling=true" | sudo xargs docker rmi

我已将其保存在/usr/local/bin/docker-purge-dangling中,这样我就可以运行它而无需记住命令。

我一直收到这个错误信息:"Error response from daemon: No such id: 75ce1f6710bab109a7d7cbee056fa8a0c7fa913e81c88e2a55121149dda80ee9",无论我尝试删除哪个镜像。我不明白为什么会出现这种情况,因为每个镜像都与一个现有的容器相关联。 - Ben Clifford
1
@BenClifford 是的,当我尝试删除图像时,我也遇到了同样的问题。我有4个没有标签的图像,我试图将它们删除。然后删除容器实例最终让我成功地将它们删除了。 - Damon

11

如果您不删除已退出的容器,您也可能会遇到此问题。您需要通过执行以下操作来删除已退出的容器:

sudo docker ps -a | grep Exit | awk '{print $1}' | sudo xargs docker rm 

然后使用

删除您的图片

sudo docker rmi <imageID>

10

首先你需要找到容纳这个图片的容器。

要删除包含这张图片的单个容器

docker ps -a

您将获得这样的输出

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
g7aea2132441        2285ff53ab18        "/bin/bash"         2 days ago                                                  tombrider 

然后使用以下方法删除容器

docker rm g7aea2132441

要删除所有容器和镜像,请执行以下操作:

  1. 删除所有容器

    docker stop $(docker ps -a -q)
    docker rm $(docker ps -a -q)
    
  2. 删除现在悬空的图片

  3. docker images -q --filter "dangling=true" | sudo xargs docker rmi
    

10

非常感谢大家的支持。

我已经尝试了你们提供的所有方法,但是无法删除以下图片:

[myself@testvm]$ docker images -a
REPOSITORY    TAG     IMAGE ID      CREATED       SIZE
hello-world   latest  c54a2cc56cbb  6 months ago  1.848 kB

我不得不把它从这里移除:

sudo rm /var/lib/docker/image/devicemapper/imagedb/content/sha256/c54a2cc56cbb2f04003c1cd4507e118af7c0d340fe7e2720f70976c4b75237dc 

现在它已经消失了。


我遇到了同样的问题,有一张名字和大小都相同的图片。我不知道这张图片是怎么创建的,肯定是我弄的,但同样的名字、大小问题真是有趣:D - orouwk
我也遇到过这个问题,docker的数据目录可能会损坏。我不建议进行点删除,除非你知道自己在做什么,而是停止docker,清空文件夹(将其内容移动到备份中),重新安装并重启docker。但是,如果您不想丢失任何内容,则存在问题,但这是确保您维护完整性的最佳方法。我想知道如果您更新docker或某些内容中途停止是否会发生这种情况,对我来说,该镜像已经有几年了,拒绝被删除。 - jgmjgm
非常感谢您的答复。我的同事上传了Docker,显然他以某种方式更新了它,使得旧版本的悬空镜像在安装新版本时没有被删除。因此,在更新后,杀掉所有运行中的容器,然后使用“rmi”命令删除所有图像后,旧版本的图像仍然存在!使用“rm”命令删除图像文件确实解决了我的问题。所有其他答案都没有真正解决OP的问题,因此这个答案绝对值得点赞! - Kevin Südmersen

3
运行我制作的清理脚本,神奇地解决了这个问题:
# remove orphan containers
docker ps -a | grep -v ":" | awk '{print $1}' | xargs docker rm -f

# remove orphan images
docker images | grep "<none>" | awk '{print $3}' | xargs docker rmi -f

1
所以...一些情况似乎是因为您有一个不再运行的容器引用了镜像。删除容器后,您就可以删除镜像。
但是肯定存在一个bug,即docker会陷入一种状态,在这种状态下,无论您做什么,它都无法删除任何镜像。这已在docker 1.4.0中修复:https://github.com/docker/docker/commit/ac40e7c

0

这将删除所有容器,然后您可以删除镜像

sudo docker ps -a | awk '{print $1}' | grep -v CONTAINER | xargs sudo docker rm {}\;


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