Docker 私有注册表 - 删除了所有映像,但仍显示在目录中

emm*_*dee 5 docker docker-registry

按照官方文档(https://docs.docker.com/registry/spec/api/#deleting-an-image),我已经能够成功删除图像。正如预期的那样,删除后,图像无法再被拉取,也无法通过 API 调用其清单。

我觉得我已经完成了最困难的部分,但问题是/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
Run Code Online (Sandbox Code Playgroud)

这是我删除图像的高级方法:

  1. 收集图像摘要: HEAD https://myprivateregistry:5001/v2/myimage/manifests/mytag添加"Accept: application/vnd.docker.distribution.manifest.v2+json"到调用的标题中

  2. 该调用返回标头键Docker-Content-Digest,其值例如sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd

  3. 使用步骤 2 中的值运行删除调用:DELETE https://myprivateregistry:5001/v2/myimage/manifests/sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd

  4. 注册表API返回202 Accepted

  5. 手动运行垃圾收集:registry garbage-collect /etc/docker/registry/config.yml

  6. 垃圾收集器从磁盘中删除关联的 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/...
Run Code Online (Sandbox Code Playgroud)

上述删除操作后:

docker/registry/v2/repositories/myimage/_layers/sha256/... (5 layers listed)
Run Code Online (Sandbox Code Playgroud)

因此,唯一剩下的就是_layers列出了相同 5x 层的目录。这似乎是它仍然列出的原因_catalog

当我删除myimage文件夹(从docker/registry/v2/repositories/myimage)时,存储库不再显示在_catalog

这似乎是一种将其从_catalog列表中清除的方法。但是 - 如果一张图像有 2 个标签,但只删除了 1 个怎么办 - 在这种情况下是否有理由删除任何内容_layers?对于图像的多个版本如何处理?显然,我不能仅仅将破坏_layers目录作为最终方法,因为在现实世界中,图像会有许多标记版本。所以这需要明智地完成。

我只是发现很难找到任何有关 Docker 注册表维护/保养的文档,也找不到子目录的架构_layers,以及为什么垃圾收集器不像清理清单和 blob 那样清理该目录。

emm*_*dee 5

经过大量研究,目前还没有仅通过 API 完全删除目录条目的方法。

v2 注册表不允许仅从图像中删除某些标签

这意味着整个图像被删除。删除标签位于注册表未来版本的开放 PR 中 ( https://github.com/docker/distribution/pull/2169 )

对于这个问题,这意味着正确的方法是从存储库列表中删除图像,正如您所假设的那样。将其从磁盘中删除。(比如你通过API删除的图片名称在rm -r v2/repositories/myimage哪里。)myimage

然后它将从存储库列表中删除_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/