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

我们有一个系统,用户可以安装一些docker集装箱。 我们没有限制,他可以安装。 过了一段时间,我们需要清理 – 删除所有不在群中使用的图像。

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

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

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

这是有道理的吗? 这会不会影响swarm?

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

命令docker rmi $(docker images -q)会和@tpbowden的回答一样,但是方式更简洁。 -q|--quiet只列出图像ID。

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

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

  1. 拉图像( <插入networking消耗警告在这里/>
  2. 如果我记得它正确( <插入频繁的支持请求警告这里关于误解的Swarm行为/> ),或者只是阻止,因为拉动作在群体中不是自动的。

“dangling = true”filter:

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


虽然挑战

你的问题让我想起了电脑里的内存pipe理。 你真正的问题是:

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

这真的很难,真的取决于你的政策。 如果您的策略是旧图像将被删除 ,可以帮助的命令是: 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代理以及Swarmpipe理器上运行,而不仅仅是 Swarmpipe理器。

Swarm和registry

注意比swarm pull image:tag 不会拉动Swarm代理上的图像! 每个Swarm代理都必须自己提取图片。 因此删除仍然使用的图像将导致networking负载。

我希望这个答案有帮助。 在这个时候,查询“ 自一个月以来没有使用的图像 ”AFAIK是没有意义的。

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

这将列出所有的图像,剥去顶部行的列标题,抓住第三列(图像ID哈希),然后尝试将其全部删除。 Docker将阻止您删除运行容器当前使用的任何图像。

如果你想以稍微“黑客”的方式做到这一点,你可以使用Docker的API来获取未被使用的图像,并以这种方式删除它们。