Docker Registry 2.0-如何删除未使用的图像?

Docker Registry 2.0-如何删除未使用的图像?,docker,docker-registry,Docker,Docker Registry,我们将我们的私人docker注册表更新为官方注册表2.0。这个版本现在可以删除由标签标识的docker图像(请参阅),但我仍然看不到清理旧图像的方法 由于我们的CI服务器正在不断生成新的图像,我需要一种方法从私有注册表中删除所有不再由命名标记标识的图像 如果没有内置的方法来实现这一点,我认为定制脚本可能会起作用,但是我也没有看到v2 API方法来列出图像的所有存储的hashtag 我怎样才能保持我的私人注册表清洁?有什么提示吗?在设计上有一些讨论-现在,没有图层清理工具/端点 我鼓励你去:

我们将我们的私人docker注册表更新为官方注册表2.0。这个版本现在可以删除由标签标识的docker图像(请参阅),但我仍然看不到清理旧图像的方法

由于我们的CI服务器正在不断生成新的图像,我需要一种方法从私有注册表中删除所有不再由命名标记标识的图像

如果没有内置的方法来实现这一点,我认为定制脚本可能会起作用,但是我也没有看到v2 API方法来列出图像的所有存储的hashtag


我怎样才能保持我的私人注册表清洁?有什么提示吗?

在设计上有一些讨论-现在,没有图层清理工具/端点

我鼓励你去:


和/或访问#docker distribution上的Freenode IRC以获取更多信息。

我在registry v2 api中寻找相同的功能,但只找到了我不想要的功能。在研究过程中,我发现了Github项目,它通过bash脚本从装入的卷中删除实际文件。未经测试它可能有用…

这是可行的,尽管很难看。您需要运行(我认为)registry 2.3或更高版本,并启用了删除功能(
registry\u STORAGE\u DELETE\u enabled=True
env var或等效功能)。下面的示例命令假设本地文件存储在
/srv/docker registry
中,但是如果不能为其他存储后端准备一些等效的东西,我会感到惊讶

对于要整理的每个存储库,需要枚举不再需要的摘要引用。最简单的方法是每个标签,使用
latest
作为示例。在本例中,您可以执行以下操作:

ls-1tr/srv/docker registry/v2/repositories/\u清单/tags/latest/index/sha256\
|尾部-n+3
这将列出推送到
latest
标签上的除三份最新摘要之外的所有摘要。或者,如果您不太关心标记,但只想保持最后几个引用处于按下状态,则可以执行以下操作:

ls-1t/srv/docker registry/v2/repositories/\u清单/修订版/sha256\
|尾部-n+3
然后,您只需删除不需要的引用:

用于以美元为单位的散列(ls-1t/srv/docker registry/v2/repositories/\u清单/标签/latest/index/sha256 | tail-n+3);做
curl-X删除https://registry:5000/v2//manifests/sha256:$hash
完成
最后,您需要执行GC运行,因为注册表实现了“软删除”,实际上不会删除任何内容,只是使其不可用:

docker exec docker registry/bin/registry\
垃圾收集/path/to/config.yml
是的,这一切都是一团糟,在后端存储中卑躬屈膝,因为没有API方法来枚举与给定标记关联的所有摘要,但这就是cookie崩溃的方式。

删除图像(可以保留10个最新版本,就像我在CI中所做的那样)分三步完成:

  • 通过设置环境变量
    REGISTRY\u STORAGE\u DELETE\u ENABLED:“true”
    并将其传递给docker注册表来启用图像删除

  • 在脚本下方运行(它将删除所有图像和标记,但保留最后10个版本)

    registry.py-l用户:pass-r--delete--num 10

  • 运行垃圾收集(您可以将其放入日常cron任务中)

    docker compose-f[path_to_your_docker_compose_file]运行注册表bin/registry garbage collect/etc/docker/registry/config.yml

  • 可以从下面的链接下载registry.py,它还允许列出图像、标记和层,以及删除特定的图像和/或标记


    在垃圾回收之前,我的注册表文件夹是7GB,在我运行上述步骤之后,它缩减到1GB。

    我将该线程的各个部分拼凑在一起,并在bash中创建了一个易于使用的清理脚本
    关于您的问题,您可以在本要点中查看:

    我需要一种方法来删除私有注册表中不再由命名标记标识的所有图像

    中的docker注册表的新版本具有此功能!但是,您将无法从API触发它

    无论如何,您将能够清除注册表中所有未标记的清单,这意味着每个被覆盖的标记都不会在注册表中留下旧的清单和blob。每个“未使用”的层都将由注册表垃圾收集器清理

    您只需运行一个
    docker exec

    docker exec ${container_id} registry garbage-collect \ 
      /path/to/your/registry/config.yml \
      --delete-untagged=true
    
    查看此垃圾收集二进制帮助:

    Usage: 
      registry garbage-collect <config> [flags]
    Flags:
      -m, --delete-untagged=false: delete manifests that are not currently referenced via tag
      -d, --dry-run=false: do everything except remove the blobs
      -h, --help=false: help for garbage-collect
    
    用法:
    注册表垃圾回收[标志]
    旗帜:
    -m、 --delete untaged=false:删除当前未通过标记引用的清单
    -d、 --干运行=错误:执行除清除斑点以外的所有操作
    -h、 --help=false:垃圾收集的帮助
    
    你可以看一看。自2018年2月23日起,它已与
    分发/注册
    、标签
    主文件
    合并并可用。它取代了
    docker/docker注册表
    项目采用新的API设计,重点关注安全性和性能


    我今天确实使用了这个功能,并恢复了89%的注册表空间(5.7GB对55GB)。然后我切换回稳定状态。

    我在docker容器中托管regestry,名称为
    docker-registry\u registry\u 1
    from
    image:registry:2

    我只是用
    -m

    docker exec docker-registry_registry_1 bin/registry garbage-collect /etc/docker/registry/config.yml -m
    

    要删除未扫描的图像,请按以下顺序手动执行三个步骤:

  • docker rmi-f**imageid**

  • rm-Rf/home/**homeditory**/docker registry/data/docker/registry/v2/repositories/**yoursystemname**/**yourimagename**/\u清单/标签/**图像版本**/

  • docker exec$(docker ps-q)bin/registry垃圾收集/etc/docker/registry/config.yml-m

  • *注意:

    <