【发布时间】:2018-03-30 12:42:02
【问题描述】:
我们有一个系统,用户可以在其中安装一些 docker 容器。我们对他可以安装的内容没有限制。一段时间后,我们需要清理 - 删除所有未在 swarm 中使用的图像。
使用 docker 远程 API 的解决方案是什么?
我们的想法是让背景图像垃圾收集器线程:
- 列出所有图片
- 尝试删除一些
- 如果失败,忽略
这有意义吗?这会以某种方式影响 swarm 吗?
【问题讨论】:
标签: docker docker-swarm
我们有一个系统,用户可以在其中安装一些 docker 容器。我们对他可以安装的内容没有限制。一段时间后,我们需要清理 - 删除所有未在 swarm 中使用的图像。
使用 docker 远程 API 的解决方案是什么?
我们的想法是让背景图像垃圾收集器线程:
这有意义吗?这会以某种方式影响 swarm 吗?
【问题讨论】:
标签: docker docker-swarm
命令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 代理都必须自己拉取图像。因此删除仍在使用的图像会导致网络负载。
我希望这个答案会有所帮助。目前没有办法查询“image not used since a month”AFAIK。
【讨论】:
你只需要'prune'
$ docker image prune --filter until=72h --force --all
【讨论】:
docker images | tail -n+2 | awk '{print $3}' | xargs docker rmi
这将列出所有图像,用列标题去除顶行,获取第三列(图像 ID 哈希),然后尝试将它们全部删除。 Docker 将阻止您删除正在运行的容器当前使用的任何图像。
如果您想以稍微不那么“hacky”的方式执行此操作,您可以使用 Docker 的 API 来获取未使用的图像并以这种方式删除它们。
【讨论】: