如何删除群中未使用的docker图像?
我们有一个系统,用户可以安装一些docker集装箱。 我们没有限制,他可以安装。 过了一段时间,我们需要清理 – 删除所有不在群中使用的图像。
什么是使用docker远程API的解决scheme?
我们的想法是有背景图像垃圾收集器线程:
- 列出所有的图像
- 尝试删除一些
- 如果失败,就忽略
这是有道理的吗? 这会不会影响swarm?
更清洁的方式列出和(尝试)删除所有图像
命令docker rmi $(docker images -q)
会和@tpbowden的回答一样,但是方式更简洁。 -q|--quiet
只列出图像ID。
它可能会删除经常使用的图像(不在清洁date运行)
如果你这样做,当用户将尝试swarm run deleted-image
它将:
- 拉图像( <插入networking消耗警告在这里/> )
- 如果我记得它正确( <插入频繁的支持请求警告这里关于误解的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来获取未被使用的图像,并以这种方式删除它们。