AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 905065
Accepted
emmdee
emmdee
Asked: 2018-03-29 10:59:43 +0800 CST2018-03-29 10:59:43 +0800 CST 2018-03-29 10:59:43 +0800 CST

Docker Private Registry - 删除了所有图像,但仍显示在目录中

  • 772

按照官方文档(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

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

  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/...

在上面的删除操作之后:

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 那样清理该目录。

docker
  • 1 1 个回答
  • 6177 Views

1 个回答

  • Voted
  1. Best Answer
    emmdee
    2018-04-10T10:34:28+08:002018-04-10T10:34:28+08:00

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

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

    这意味着整个图像被删除。标签的删除是在未来版本的注册表的开放 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/

    • 5

相关问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve