我在 docker-registry v2 中删除图像或标签时遇到以下问题:
我有一台运行 docker-registry 的服务器。我创建了一个镜像并推送了它,现在我想把它删除。现在我想删除这个镜像(或者至少删除标签,如果镜像不可能的话)。
当前前端版本不支持此类功能。
我尝试通过curl -u MY_USERNAME -X DELETE MY_DOMAIN:PORT/v2/IMAGE_NAME/manifests/REFERENCE
命令(如HTTP API reference
states)输入密码,但执行结果为空行,没有身份验证错误(身份验证已激活)或成功消息。标签仍然可用。
由于我可以访问服务器,我想到了以下想法:我可以简单而安全地删除文件夹v2/repositories/IMAGE_NAME/_manifests/tags/VERSION
(或其他文件/文件夹)吗?或者这会导致注册表中断?我必须执行哪些初始步骤(例如停止注册表服务)?
答案1
是的,他们没有让这变得简单,而且它仍然不完美,但是 v2 注册表 API 现在可以删除图像。
我可以简单而安全地删除文件夹 v2/repositories/IMAGE_NAME/_manifests/tags/VERSION 吗?
实际的图像数据存储在磁盘上的 blobs 目录中,但它们在不同的清单之间共享,因此,除非您考虑过可能共享 blobs 的所有图像,否则清除该目录是不安全的。
以下是使用 v2 docker API 删除镜像的方法:
首先,您的注册表必须启用 DELETE。 设置环境变量:
REGISTRY_STORAGE_DELETE_ENABLED: "true"
或者在 config.yml 中设置
storage:
delete:
enabled: true
接下来,通过 API 调用运行删除(您可以通过 Postman 或使用 curl/etc 轻松测试)
笔记:在以下调用中,添加"Accept: application/vnd.docker.distribution.manifest.v2+json"
到 HTTP 标头
收集图像摘要:
HEAD https://myprivateregistry:5001/v2/<image_name>/manifests/<image_tag>
Docker-Content-Digest
此调用返回带有如下值的标头键:sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd
使用步骤 2 中的值,运行
DELETE
http 调用:DELETE https://myprivateregistry:5001/v2/<image_name>/manifests/sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd
API 返回
202 Accepted
如果您不想等待下一次预定的运行,请手动运行垃圾收集:
registry garbage-collect /etc/docker/registry/config.yml
如果将注册表作为容器运行的示例:
docker exec -t registry-test ./bin/registry garbage-collect /etc/docker/registry/config.yml
垃圾收集器会从磁盘中删除相关的 blob 和清单。
此时,image:tag 已从磁盘中完全删除并从注册表中清除。这些 blob 已被删除,你会看到清单已从v2/repositories/<image_name>/_manifests
注意:如果这是您的存储库中的最后一个图像,您仍然必须手动从磁盘中删除存储库列表(v2/repositories/<image_name>/_layers
) - 但这只是元数据。实际的图像数据已被删除。我相信这可能是垃圾收集器中的一个错误。我在这里有一个问题:Docker Private Registry-已删除所有图像,但仍显示在目录中
更多细节:
https://docs.docker.com/registry/spec/api/#deleting-an-image https://jsosic.wordpress.com/2017/01/23/deleting-images-from-docker-registry/