fr0*_*0zt 8 docker docker-registry
我是一个新的 docker 用户,正在尝试了解一些有关 docker 的知识。\n我有一个私有的 docker 注册表。里面有一些图像(例如:I1,I2,I3,I4,I5)。很多这些图像里面都有标签。让我们考虑以下几点:
\nImage I1 - Tags: T11, T12, T13\nImage I2 - Tags: T21, T22, T23, T24\nImage I3 - Tags: T31, T32\nImage I4 - Tags: T41, T42, T43, vT44\nImage I5 - Tags: T51, T52\nRun Code Online (Sandbox Code Playgroud)\n我只想T12, T22 and T52从 docker 注册表中删除 Tags: 。
我怎样才能实现它?
\n我\xc2\xb4已经阅读了很多帖子,但我仍然没有\xc2\xb4t弄清楚这一点。\n这些似乎有一些有价值的内容:\n https://docs.docker.com/registry/spec/api /#deleting-an-image \n从私有 Docker 注册表中删除图像的方法\n尽管读完后我仍然不知道如何做到这一点。
\n如果有人能指出我正确的方向,我将不胜感激。
\nBMi*_*tch 12
如果您想删除标签而不是图像清单,这比表面上看起来要复杂一些。首先,先决条件是,您的注册表需要允许删除图像中默认未打开的图像registry:2。实现这一点的简单方法是REGISTRY_STORAGE_DELETE_ENABLED=true在容器上设置环境变量。
接下来,了解标签和图像清单之间的区别。清单由摘要表示,是指向图像配置和图层的 json 数据。一个标签指向一个清单,但多个标签可能指向同一个清单,并且一个清单可能没有任何标签指向它。如果删除清单,也会删除指向该清单的所有标签,因此在删除标签时需要小心,以免意外删除要保留的标签引用的清单。
因此,执行此操作的正常方法存在问题。通常的方法是在注册表中查询要删除的清单的摘要,然后删除该摘要。您可以从标题中获取该摘要:
acceptM="application/vnd.docker.distribution.manifest.v2+json"
acceptML="application/vnd.docker.distribution.manifest.list.v2+json"
curl -H "Accept: ${acceptM}" \
-H "Accept: ${acceptML}" \
-I -s "https://registry.example.org/v2/${repo}/manifests/${tag}"
Run Code Online (Sandbox Code Playgroud)
然后对该摘要的删除请求将删除清单以及也指向它的所有标签:
curl -H "Accept: ${acceptM}" \
-H "Accept: ${acceptML}" \
-X DELETE -s "https://registry.example.org/v2/${repo}/manifests/${digest}"
Run Code Online (Sandbox Code Playgroud)
但是,如果您只想删除标签,distribution-spec 中有一个删除标签 API,但很少有注册管理机构实现了它。该删除看起来像:
curl -H "Accept: ${acceptM}" \
-H "Accept: ${acceptML}" \
-X DELETE -s "https://registry.example.org/v2/${repo}/manifests/${tag}"
Run Code Online (Sandbox Code Playgroud)
对于不支持此功能的注册管理机构,我发现的最佳解决方案是推送替换标签的虚拟清单,然后删除该虚拟清单。使用curl 处理起来有点麻烦,还有更多我没有包含的媒体类型标头,并且这不涉及身份验证。对于所有这些挑战,我转而用 Go 编写。我自己的工具是regclient,还有 skopeo 和 Crane 等其他工具。在 regclient 中,执行此操作的 regctl 命令如下所示:
regctl tag rm registry.example.org/image1:T12
regctl tag rm registry.example.org/image2:T22
regctl tag rm registry.example.org/image5:T22
Run Code Online (Sandbox Code Playgroud)
删除图像后,您可能想要清理所使用的存储,为此,您需要在没有其他推送正在进行时运行垃圾收集(有些会禁用注册表或等到他们知道上传不会发生时)跑步)。对于该registry:2图像,GC 命令如下所示:
docker exec registry /bin/registry garbage-collect \
/etc/docker/registry/config.yml --delete-untagged
Run Code Online (Sandbox Code Playgroud)
这将删除所有未标记的清单以及任何未引用的 blob。
注意:分发注册表中的未标记清单当前包括多平台映像的所有子清单。这意味着如果您的注册表中有多平台映像,删除未标记的清单可能会导致数据丢失。有问题 3178需要跟踪该问题何时得到解决。
需要执行 2 个步骤:
使用 HTTP/REST API 有更简洁的方法来执行此操作,但您可以使用以下命令执行旧标签(> 30 天)的受控删除:
find /var/lib/registry/docker/registry/v2/repositories/*/_manifests/tags -type d -mtime +30 -maxdepth 1 -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)
这将有效地“取消标记”图像。我强烈建议您运行该find命令,而无需-exec rm先确定要删除的内容!
find /var/lib/registry/docker/registry/v2/repositories/*/_manifests/tags -type d -mtime +30 -maxdepth 1
Run Code Online (Sandbox Code Playgroud)
Kubernetes 示例(从主机运行):
find /var/lib/registry/docker/registry/v2/repositories/*/_manifests/tags -type d -mtime +30 -maxdepth 1
Run Code Online (Sandbox Code Playgroud)
最后,运行garbage-collection -m可执行文件。
kubectl exec -it deploy/registry-docker-registry -- \
sh -c 'find /var/lib/registry/docker/registry/v2/repositories/*/_manifests/tags -type d -mtime +30 -maxdepth 1 -exec rm -rf {} \;'
Run Code Online (Sandbox Code Playgroud)
或者,您可以从主机在容器内运行它,如下所示(Kubernetes 示例:
/bin/registry garbage-collect -m /etc/docker/registry/config.yml
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18255 次 |
| 最近记录: |