如何删除 swarm 中未使用的 docker 个图像?

How to delete unused docker images in swarm?

我们有一个系统,用户可以在其中安装一些 docker 容器。我们对他可以安装的内容没有限制。一段时间后,我们需要清理 - 删除 swarm 中所有未使用的图像。

使用 docker 远程 API 的解决方案是什么?

我们的想法是让背景图像垃圾收集器线程:

这有意义吗?这会以某种方式影响 swarm 吗?

docker images | tail -n+2 | awk '{print }' | xargs docker rmi

这将列出所有图像,去掉带有列标题的顶行,获取第 3 列(图像 ID 哈希),然后尝试将它们全部删除。 Docker 将阻止您删除 运行 个容器当前使用的任何图像。

如果你想以稍微少一点的方式做到这一点 'hacky',你可以使用 Docker 的 API 获取未使用的图像并删除它们方式。

列出和(尝试)删除所有图像的更简洁方式

命令 docker rmi $(docker images -q) 与@tpbowden 的答案相同,但方式更简洁。 -q|--quiet 只列出图片 ID。

它可能会删除经常使用的图像(不是运行清理日期)

如果您这样做,当用户尝试 swarm run deleted-image 时,它将:

  1. 或者拉取镜像(<在此插入网络消耗警告/>
  2. 如果我没记错的话,要么只是阻止,因为拉动作在 swarm 中不是自动的(< insert frequent support request warning here about misunderstanding Swarm behavior />)。

"dangling=true"过滤器:

一个有用的选项是 --filter "dangling=true"。执行 swarm images -q --filter "dangling=true" 将显示当前 运行ning 图像。


虽然挑战

你的问题让我想起了计算机中的内存管理。你真正的问题是:

How to remove image that won't be used in the future?

这真的很难,而且真的取决于你的政策。如果您的政策是要删除旧图像,那么可以提供帮助的命令是:docker images --format='{{.CreatedSince}}:{{ .ID}}'。但是随后黑客开始......您可能需要 grep "months" 然后 cut -d ':' -f 2.

整个命令的结果为:

docker rmi $(docker images --format='{{.CreatedSince}}:{{ .ID}}' G months | cut -d ':' -f 2)

请注意,此命令需要在每个 Swarm 代理和 Swarm 管理器上 运行,而不是 Swarm 管理器。

Swarm 和注册表

请注意 swarm pull image:tag 不会 在 Swarm 代理上拉取镜像!每个 Swarm 代理必须自己拉取镜像。因此,删除仍在使用的图像将导致网络负载。

希望这个回答对您有所帮助。此时没有办法查询“自一个月以来未使用的图像”AFAIK。

你只需要'prune'

$ docker image prune --filter until=72h --force --all