按照官方文档(https://docs.docker.com/registry/spec/api/#deleting-an-image),我已经能够成功删除图像。正如预期的那样,删除后,图像无法再被拉取,也无法通过 API 调用其清单。
我觉得我已经完成了最困难的部分,但问题是删除完成后repo 仍然列在下面。/v2/_catalog
我正在尝试完全清除注册表。
这是我的注册表撰写文件:
registry:
image: registry:2.5.2
container_name: registry-test
ports:
- 5007:5000
environment:
REGISTRY_STORAGE: s3
REGISTRY_HTTP_TLS_CERTIFICATE: /etc/cert.crt
REGISTRY_HTTP_TLS_KEY: /etc/cert.key
REGISTRY_STORAGE_S3_ACCESSKEY: ******
REGISTRY_STORAGE_S3_SECRETKEY: ******
REGISTRY_STORAGE_S3_REGION: us-west-1
REGISTRY_STORAGE_S3_BUCKET: ******
REGISTRY_STORAGE_S3_SECURE: "true"
REGISTRY_STORAGE_DELETE_ENABLED: "true"
volumes:
- /dockerdata/volumes/registry-test/etc/cert.crt:/etc/cert.crt
- /dockerdata/volumes/registry-test/etc/cert.key:/etc/cert.key
restart: unless-stopped
这是我删除图像的高级方法:
收集图像摘要:
HEAD https://myprivateregistry:5001/v2/myimage/manifests/mytag
添加"Accept: application/vnd.docker.distribution.manifest.v2+json"
到调用的标题中该调用返回带有值的标题键
Docker-Content-Digest
,例如sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd
使用第 2 步中的值,运行删除调用:
DELETE https://myprivateregistry:5001/v2/myimage/manifests/sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd
注册表 API 返回
202 Accepted
手动运行垃圾收集:
registry garbage-collect /etc/docker/registry/config.yml
垃圾收集器从磁盘中删除关联的 blob(这里省略了日志,但它成功删除了 blob)
此时,我可以确认 blob 已从磁盘中完全删除,并且我无法再调用图像详细信息(如上面的步骤 1),所以我认为我已经完成了。
但是,在运行时:/v2/_catalog
我的关联存储库仍然列出(即使其中没有图像)!显然它无法拉取或使用,但是既然它没有与之关联的图像,我如何才能从该列表中完全删除该存储库?
我在任何地方都看不到如何在 API 文档页面上正确删除它。也许我在某个地方错过了它?
编辑 -
我想添加更多关于注册表在上述删除发生之前和之后的外观的信息。
在上面的删除操作之前:
docker/registry/v2/repositories/myimage/_manifests/revisions/...
docker/registry/v2/repositories/myimage/_manifests/tags/...
docker/registry/v2/repositories/myimage/_layers/sha256/... (5 layers listed)
docker/registry/v2/blobs/sha256/...
在上面的删除操作之后:
docker/registry/v2/repositories/myimage/_layers/sha256/... (5 layers listed)
所以唯一剩下的就是_layers
列出了相同 5x 层的目录。这似乎是它仍然上市的原因_catalog
当我删除myimage
文件夹(来自docker/registry/v2/repositories/myimage
)时,存储库不再显示在_catalog
这似乎是一种从_catalog
列表中清除它的方法。但是 - 如果图像有 2 个标签,但只有 1 个被删除 - 在这种情况下是否有理由删除任何内容_layers
?如何处理多个版本的图像?显然,我不能仅仅破坏_layers
目录作为最终方法,因为在现实世界中,会有许多图像的标记版本。所以这需要智能地完成。
我只是发现很难找到有关 Docker 注册表的维护/维护的任何文档,也很难找到
_layers
子目录的架构,以及为什么垃圾收集器不会像处理清单和 blob 那样清理该目录。
经过大量研究,目前尚无仅通过 API 完全删除目录条目的方法。
这意味着整个图像被删除。标签的删除是在未来版本的注册表的开放 PR 中 ( https://github.com/docker/distribution/pull/2169 )
对于这个问题,这意味着正确的方法是从 repo 列表中删除图像,这与您假设的完全一样。从磁盘中删除它。(比如你通过API删除的图片名称
rm -r v2/repositories/myimage
在哪里。)myimage
然后它将从 repo 列表中
_catalog
删除,您已完成删除过程。没有必要像提到的另一个答案那样重新启动任何东西。当添加了从注册表中删除特定标签的功能时,此过程将发生变化。现在,要么全有,要么全无。
参考:
https://forums.docker.com/t/delete-repository-from-v2-private-registry/16767/5
https://github.com/docker/distribution/pull/2169
https://docs.docker.com/registry/spec/api/