2

我正在使用docker,我发现当我运行

docker images -a

我有大量没有标签的图像,或者至少它们有一个标签

<none>

这些在我的磁盘上浪费了太多空间,现在 df -h 告诉我我的根目录已满。

我潜伏在互联网上,发现

docker rmi -f $(docker images -a | grep "^<none>" | awk '{print $3}')

至少会遍历所有没有的,但随后我会收到一大堆错误消息。

Error: response from daemon: Conflict, <id> wasn't deleted
Error: response from daemon: Conflict, <id> wasn't deleted 
Error: response from daemon: Conflict, <id> wasn't deleted
Error: response from daemon: Conflict, <id> wasn't deleted 
etc...
Error: failed to remove images: [<list of all the image ids that I want gone>]

这变得有些烦人。有谁知道这些没有标记的图像是什么,为什么我的命令没有摆脱它们?

4

2 回答 2

6

每当您构建一个新版本的标记镜像(例如,您运行docker build -t foo .,更改 Dockerfile 中的某些内容,然后再次运行该命令)时,旧镜像不会被删除;它只是把它的标签拿走了。您看到的<none>s 是没有任何标签的图像,您可以通过指定它们的图像 ID(fe336c4cdb2f或其他)在命令中引用它们。因此,您可以通过将这些 ID 传递给 来删除它们docker rmi,或者您可以这样做:

docker images -f dangling=true -q | xargs -r docker rmi

如果您仍然收到有关无法删除图像的错误消息,则可能是仍然存在使用这些旧图像的容器;通过运行检查docker ps -a

于 2015-07-28T21:23:44.787 回答
3

那些<none>在 REPOSITORY 中的内容,当您特别这样做时docker images -a并不意味着要被删除。这些是构成图像的内部层。

正如@jwodder 所建议的那样,您应该删除执行<none>时出现的那些docker images(注意:我没有这样做-a)。如果你<none>在 REPOSITORY 中看到你这样做docker images,那么你可以这样做:
docker rmi -f $(docker images -f dangling=true -q)

如果您的磁盘空间已满,请尝试删除您不需要的图像并查看何时删除docker images,而不是使用-a.

于 2015-07-28T22:53:12.733 回答