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

igr*_*igr 4 docker docker-swarm

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

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

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

  • 列出所有图像
  • 尝试删除一些
  • 如果它失败了,那就忽略吧

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

Auz*_*ias 6

清除列表和(尝试)删除所有图像的方式

该命令docker rmi $(docker images -q)与@tpbowden的答案相同,但方式更清晰.该-q|--quiet只列出图像ID.

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

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

  1. 拉动图像(<在此处插入网络消耗警告/>)
  2. 如果我记得正确的话,只要阻止因为拉动作不是自动的(<在这里插入频繁的支持请求警告关于被误解的Swarm行为/>).

"dangling = true"过滤器:

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


虽然挑战

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

如何删除将来不会使用的图像?

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

整个命令将导致:

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

请注意,此命令需要在每个Swarm代理以及Swarm管理器上运行,而不仅仅是 Swarm管理器.

Swarm和注册表

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

我希望这个答案有所帮助.此时没有任何意义可以查询" 自一个月以来未使用的图像 "AFAIK.


Sun*_*oon 5

所有你需要的是'修剪'

$ docker image prune --filter until=72h --force --all
Run Code Online (Sandbox Code Playgroud)