【问题标题】:How to "delete" an image from a private Docker Registry?如何从私有 Docker Registry 中“删除”图像?
【发布时间】:2026-02-01 07:20:03
【问题描述】:

我正在为 docker 编写一个 API 客户端,而注册表 API 很难使用。我正在尝试从注册表中删除图像,但是我不断收到此错误

[ { code: 'UNSUPPORTED', message: 'The operation is unsupported.' } ]

我的步骤如下,

 >  GET http://localhost:5000/v2/
  >  registry/2.0
 >  registry/2.0
 >  GET http://localhost:5000/v2/_catalog/
  >  { repositories: [ 'alpine' ] }
 >  GET http://localhost:5000/v2/alpine/tags/list
  >  { name: 'alpine', tags: [ 'latest' ] }
 >  HEAD http://localhost:5000/v2/alpine/manifests/latest
  >  sha256:df73ed0973f15f40496c148330f9b559f0a5583c03f6ac8d26adadf6f4690aff
 >  DELETE http://localhost:5000/v2/alpine/manifests/sha256:df73ed0973f15f40496c148330f9b559f0a5583c03f6ac8d26adadf6f4690aff
[ { code: 'UNSUPPORTED', message: 'The operation is unsupported.' } ]

编辑

我正在更新我的问题,因为我找到了 REGISTRY_STORAGE_DELETE_ENABLED 变量。

我现在像这样运行注册表容器,

docker run -d -p 5000:5000 -e REGISTRY_STORAGE_DELETE_ENABLED=true --name registry2 registry

这会产生一个新的错误,

[ { code: 'MANIFEST_UNKNOWN', message: 'manifest unknown' } ]

显然UNSUPPORTED 错误,确实意味着特定功能被禁用。

但是我读到的所有内容都说删除清单的实体引用(来自 HEAD 请求的摘要)应该删除存储库。我只是想让我的私人注册表中的存储库无法访问,我认为已删除。

如何从私有 registry 中删除镜像,使其无法被拉取?

【问题讨论】:

  • 这方面还有很多问题。我最近没有尝试过,但前一段时间它对我有用。这个问题可能有用:github.com/docker/docker-registry/issues/…
  • 我想,这完全一样,你能检查一下吗? *.com/questions/39918794/…
  • 是/否,有点不同。对我来说,在这个问题中找到了解决方案,github.com/docker/distribution/issues/1831 基本上,获取正确摘要的 HEAD 请求从 V1 模式而不是 V2 模式中获取摘要。要获得 V2 模式和正确的摘要,必须在 HEAD 请求中设置特定的标头。顺便说一句,GET 请求也可以正常工作,并返回应该删除的层摘要。

标签: docker-registry docker-api


【解决方案1】:

即使这是一个老问题:解决方案很简单。

DELETE http://localhost:5000/v2/alpine/manifests/sha256:df73ed0973f15f40496c148330f9b559f0a5583c03f6ac8d26adadf6f4690aff

错误,因为摘要以 sha256: 为前缀。简单地删除前缀,然后删除是可能的:

DELETE http://localhost:5000/v2/alpine/manifests/df73ed0973f15f40496c148330f9b559f0a5583c03f6ac8d26adadf6f4690aff

【讨论】: