我们有一个系统,用户可以在其中安装一些docker容器。我们没有限制他可以安装的东西。一段时间后,我们需要清理 - 删除群中未使用的所有图像。
使用docker远程API的解决方案是什么?
我们的想法是拥有背景图片 - 垃圾收集器线程:
这有意义吗?这会以某种方式影响群体吗?
答案 0 :(得分:6)
命令docker rmi $(docker images -q)
与@tpbowden的答案相同,但更清晰。 -q|--quiet
仅列出图片ID。
如果您这样做,当用户尝试swarm run deleted-image
时,它会:
有用的选项是--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)
请注意,此命令需要在每个Swarm代理和Swarm管理器上运行,而不是仅 Swarm管理器。
请注意,swarm pull image:tag
不会在Swarm代理上提取图像!每个Swarm代理都必须自己提取图像。因此,删除仍然使用的图像将导致网络负载。
我希望这个答案有所帮助。目前,没有理由查询“图片自一个月以来未使用”AFAIK。
答案 1 :(得分:3)
您需要的只是'prune'
$ docker image prune --filter until=72h --force --all
答案 2 :(得分:0)
docker images | tail -n+2 | awk '{print $3}' | xargs docker rmi
这将列出所有图像,使用列标题剥离顶行,抓取第3列(图像ID哈希),然后尝试将它们全部删除。 Docker将阻止您删除运行容器当前使用的任何图像。
如果你想以稍微不那么“hacky”的方式做这件事,你可以使用Docker的API来获取未被使用的图像并以这种方式删除它们。