在远程Docker仓库中删除Docker存储库。

18

如何在管理多个 Docker 代码仓库的 Docker 仓库中删除其中一个仓库?

已有 Docker 仓库 repo1repo2

$ curl -X GET localhost:5000/v2/_catalog
{"repositories":["repo1", "repo2"]}

我想要移除仓库repo1,以便 _catalog 列表中不再显示 repo1,例如:

$ curl -X GET localhost:5000/v2/_catalog
{"repositories":["repo2"]}

目前,存储库 repo1 只有默认的 "latest" 镜像标签。

$ curl -X GET localhost:5000/v2/repo1/tags/list
{"name":"repo1","tags":["latest"]}

(也许这会影响删除 repo1 ?)



我已经尝试过...

以下命令返回了404页面未找到

$ curl -X DELETE localhost:5000/v1/repositories/repo1
$ curl -X DELETE localhost:5000/v2/repositories/repo1
$ curl -X DELETE localhost:5000/v2/repo1

以下返回:{"errors":[{"code":"UNSUPPORTED","message":"该操作不受支持。"}]}

$ curl -X DELETE localhost:5000/v2/repo1/manifests/latest

使用版本

远程docker-registry为registry/2.0

curl -vX GET localhost:5000/v2/
< HTTP/1.1 200 OK
...
< Docker-Distribution-Api-Version: registry/2.0
...

$ /bin/registry github.com/docker/distribution v2.4.1

2
可能是重复的问题:如何使用Docker Registry API V2从私有注册表中删除图像?(https://dev59.com/3loU5IYBdhLWcg3w15ez) - BMitch
@BMitch 类似但不同的是,我希望 repo1 存储库不会在 _catalog 中列出。 - JamesThomasMoon
1
你看到指向 https://docs.docker.com/registry/configuration/#delete 的答案了吗? - BMitch
2个回答

35
通过启用DELETE API,您只能从v2/_catalog中删除TAG而不是整个存储库。
为此,您应该:
1. 启用DELETE API:
1.1 通过config.yml: storage.delete.enabled:true 1.2 通过env: -e REGISTRY_STORAGE_DELETE_ENABLED=true 2. 通过GET /v2//manifests/获取标记引用(不要忘记具有Header Accept: application/vnd.docker.distribution.manifest.v2+json)。
在响应头中,您有docker-content-digest: 3. 发送DELETE /v2//manifests/ 4. 运行垃圾收集器: bin/registry garbage-collect /etc/docker/registry/config.yml
5. 删除文件: rm -r /var/lib/registry/docker/registry/v2/repositories// 最后:现在您可以看到
curl -X GET localhost:5000/v2/_catalog {"repositories":["repo2", "repo3"]} ps.
5的后果:https://github.com/docker/distribution/issues/2983#issuecomment-530251232

2
请注意,这并不会删除单个标签,因为多个标签可以引用由摘要标识的一个图像。 - Sebastian Ullrich
垃圾桶/注册表在哪里?@negar - undefined

5
没有删除存储库的API。您需要删除存储库中的单个标签或清单。在OCI的distribution-spec之前,甚至没有删除标签的API,您需要通过摘要删除图像清单,这将删除指向相同摘要的所有标签。

要删除清单,请先确保已根据此文档启用了删除功能,然后再尝试任何操作。在注册表的配置中,您需要添加以下部分:

delete:
  enabled: true

您可以通过在启动注册表容器时指定REGISTRY_STORAGE_DELETE_ENABLED=true环境变量来设置。

然后,您可以调用清单删除API:

curl -X DELETE \
     -s "https://registry.example.org/v2/${repo}/manifests/${sha}"

如果你想要一个包装器来处理认证,甚至支持标签删除,请查看我编写的regclient的regctl CLI。Google的crane和RedHat的skopeo也可以提供此功能。
一旦清除了清单,您仍然需要使用垃圾回收清理清单指向的其他项目(这需要在没有写操作时执行):
docker exec registry /bin/registry garbage-collect /etc/docker/registry/config.yml --delete-untagged

尽管如此,您仍将达到存储库本身未被删除的点。您可以从注册表的文件系统中删除整个目录。但我建议从项目中实现对此的支持。有关在官方注册表映像中添加此功能的更多详细信息,请参见this issue


+1 我已经进行了推荐的更改。现在我得到的结果是*$ curl -X DELETE localhost:5000/v2/repo1/manifests/latest*,返回 *{"errors":[{"code":"DIGEST_INVALID","message":"提供的摘要与上传的内容不匹配"}]}*。 - JamesThomasMoon
1
要删除一个镜像,你需要指定摘要而不是标签。请参阅 https://docs.docker.com/registry/spec/api/#deleting-an-image - BMitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接