【问题标题】:How to delete unused docker images in swarm?如何删除 swarm 中未使用的 docker 镜像?
【发布时间】:2018-03-30 12:42:02
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: docker docker-swarm


【解决方案1】:

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

命令docker rmi $(docker images -q) 将与@tpbowden 的答案相同,但方式更简洁。 -q|--quiet 仅列出图像 ID。

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

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

  1. 要么拉取图片(
  2. 如果我没记错的话,要么只是阻止,因为拉动操作在 swarm 中不是自动的()。

“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 代理都必须自己拉取图像。因此删除仍在使用的图像会导致网络负载。

我希望这个答案会有所帮助。目前没有办法查询“image not used since a month”AFAIK。

【讨论】:

    【解决方案2】:

    你只需要'prune'

    $ docker image prune --filter until=72h --force --all
    

    【讨论】:

      【解决方案3】:
      docker images | tail -n+2 | awk '{print $3}' | xargs docker rmi
      

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

      如果您想以稍微不那么“hacky”的方式执行此操作,您可以使用 Docker 的 API 来获取未使用的图像并以这种方式删除它们。

      【讨论】:

      • 谢谢!如果这会影响群体的大量运行,您是否有见解?
      • 不确定这会如何影响 swarm - 您最终可能会从某些节点中删除图像,但不是全部。如果这就是你的意思,它不会对性能产生明显的开销 - 它只是从磁盘中删除文件。
      猜你喜欢
      • 2022-12-26
      • 2015-12-19
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 2020-11-14
      • 2020-03-23
      相关资源
      最近更新 更多