【问题标题】:How to clear obsolete docker images created via Jenkins CI/CD?如何清除通过 Jenkins CI/CD 创建的过时 docker 镜像?
【发布时间】:2019-10-18 15:12:18
【问题描述】:

如何清除通过 Jenkins CI/CD 创建的过时 docker 镜像?

我创建了一个 CI/CD Jenkins 管道,它执行以下任务

  1. 运行 gradle 构建。 gradle build 完成下一组任务
    • 构建几个springboot微服务
    • 为每个微服务创建一个 docker 镜像
    • 它将图像推送到私有 Docker 注册表
  2. 执行 helm 模板以在 k8s 集群中创建/刷新 k8s 部署。

虽然整个过程运行良好。我正在为几个场景寻找解决方案。

  1. 由于是 CI/CD,每次代码推送都会触发构建。因此,私有注册表中的 docker 镜像也将被创建并最终耗尽所有磁盘空间。如何有条件地清除 docker 镜像?
  2. 如果开发了一个脚本以使用 docker REST API 来清除图像,我如何有条件地跳过以删除某些图像(例如:与标记的 Jenkins 构建相关的图像)
  3. 对于这项任务是否有任何建议或标准?

【问题讨论】:

    标签: spring-boot docker jenkins continuous-integration


    【解决方案1】:

    解决此问题的一种方法是使用不同的 jenkins 作业,尤其是为了删除旧图像。

    该工作可能会trigger on some appropriate schedule,例如每天晚上、每周一次等等,具体取决于您担心空间不足的速度。

    关于如何删除图像,请查看带有--filter 选项的docker image prune 命令,如this answer 中所述。这将只允许您删除图像,例如超过 7 天的图像,等等。

    希望有帮助!

    【讨论】:

    • docker image prune 是清除 Jenkins slave 上的镜像。我想清除私有 Docker 注册表中的图像。
    • docker 命令实际上是一个与 docker 服务器通信的客户端。现在,是的,在大多数情况下,它与在同一 VM 中运行的服务器通信,但您可以使用 DOCKER_HOST env var 配置 docker 客户端连接到的位置 - 例如请参阅此处:docs.docker.com/engine/reference/commandline/cli/… 以及如何设置它的示例:nickjanetakis.com/blog/…
    【解决方案2】:

    我认为下面应该是前进的方向

    1. 找到所有的容器

      docker ps -a -f "你的条件"

    2. 然后停止并删除您找到的所有容器 下面的命令

      docker stop "容器名称" docker rm "容器名称"

    3. 找到所有悬空图像

      docker 图像 -f "dangling=true"

    4. 删除所有图片

      docker rmi "镜像名称"

    【讨论】:

    • 这适用于虚拟机/机器上的图像,但不适用于 docker 注册表
    • 您的 docker 注册表是否在您创建映像的同一台虚拟机/机器上可用?
    • 没有。 docker 镜像在 Jenkins 从机中创建并推送到在不同 VM 中运行的私有注册表
    • 参考 stackoverflow.com/questions/25436742/… 并由 Yavuz Sert 发布答案
    猜你喜欢
    • 2020-04-05
    • 1970-01-01
    • 2020-11-04
    • 2020-08-09
    • 1970-01-01
    • 2020-06-02
    • 2019-08-03
    • 1970-01-01
    • 2018-08-23
    相关资源
    最近更新 更多