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)
这是我删除图像的高级方法:
收集图像摘要:
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/...
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 那样清理该目录。
经过大量研究,目前还没有仅通过 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/
| 归档时间: |
|
| 查看次数: |
7519 次 |
| 最近记录: |