从私有Docker仓库中“删除”图像的方法是什么?

9

我正在为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请求的摘要)应该会删除存储库。我只想使我的私有注册表中的存储库不可访问,我认为这是已删除的。

如何从私有注册表中删除图像,以使其无法被拉取?


这还存在很多问题。我最近没有尝试过,但是一段时间前它对我有效。这个问题可能会有用:https://github.com/docker/docker-registry/issues/988#issuecomment-249532002 - lvthillo
我认为这是完全相同的事情,你能检查一下吗?http://stackoverflow.com/questions/39918794/cant-delete-docker-image-from-registry/39942620#39942620 - Evedel
1
对我来说,解决方法在这个问题中找到了,https://github.com/docker/distribution/issues/1831基本上,获取正确摘要的 HEAD 请求会从 V1 模式中获取摘要,而不是 V2 模式。为了获取 V2 模式和正确的摘要,在 HEAD 请求中必须设置特定的标头。另外,GET 请求也可以正常工作,并返回应该删除的层摘要。 - Aage Torleif
1个回答

2
即使这是一个老问题:解决方案很简单。
DELETE http://localhost:5000/v2/alpine/manifests/sha256:df73ed0973f15f40496c148330f9b559f0a5583c03f6ac8d26adadf6f4690aff

这是错误的,因为摘要以sha256:为前缀。只需简单地删除前缀,然后就可以执行删除操作:

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

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