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

标签 docker docker-swarm

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

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

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

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

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

    最佳答案

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

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

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

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

  • 要么拉取镜像( < 在此插入网络消耗警告/> )
  • 如果我没记错的话,要么只是阻止,因为拉动操作在 swarm 中不是自动的( < 在此处插入有关误解的 Swarm 行为的频繁支持请求警告/> )。

  • “悬垂=真”过滤器:

    一个有用的选项是 --filter "dangling=true" 。执行 swarm images -q --filter "dangling=true" 将显示当前未运行的图像。

    虽然挑战

    你的问题让我想起了计算机中的内存管理。你真正的问题是:

    How to remove image that won't be used in the future?



    这真的很难,真的取决于你的政策。如果您的策略是要删除旧图像,则可以提供帮助的命令是: 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。

    关于docker - 如何删除 swarm 中未使用的 docker 镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36775109/

    相关文章:

    php - Docker php :5. 6-apache 403(因为路径的某个组件缺少搜索权限)

    docker - service 命令的 --limit-xxx 选项是否限制每个服务或每个容器的资源?

    docker - 如何使用 Docker Compose 文件发布具有 'mode=host' 的一系列端口?

    docker - Manager Leader 和 Manager 有什么区别

    nginx - nginx 反向代理可访问多个 docker 容器

    networking - Docker容器无法连接到主机: No route to host

    docker - 在Docker中以 “/bin/bash”作为入口点在命令中执行时,JavaScript中的Shebang被忽略

    Docker swarm leave --force - 超过上下文截止日期

    Docker 集群模式 : scale down a node and remove services

    docker - docker swarm中的Prometheus dns服务发现