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

时间:2016-04-21 16:09:32

标签: docker docker-swarm

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

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

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

  • 列出所有图片
  • 尝试删除一些
  • 如果失败,只需忽略

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

3 个答案:

答案 0 :(得分:6)

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

命令docker rmi $(docker images -q)与@tpbowden的答案相同,但更清晰。 -q|--quiet仅列出图片ID。

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

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

  1. 拉动图片(<在此插入网络消费警告/>
  2. 要么阻止,因为如果我记得正确的话,拉动动作不是自动的(<在这里插入频繁的支持请求警告有关被误解的Swarm行为/> )。
  3. “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)
    

    请注意,此命令需要在每个Swarm代理和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来获取未被使用的图像并以这种方式删除它们。