无法从 Docker 代理/镜像/缓存注册表中删除映像

zb2*_*226 2 docker docker-registry docker-proxy

registry:2通过 docker-compose运行镜像1.27.4,docker 本身位于19.03.13.

注册表被配置为“拉取缓存”,也被某些人称为“代理”或“镜像”。设置非常基本,遵循官方文档:

version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
  delete:
    enabled: true
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3
proxy:
  remoteurl: https://registry-1.docker.io
Run Code Online (Sandbox Code Playgroud)

当使用标准程序通过 API 删除此注册表上的图像时...

  1. 查找标签名称

    export HEADER="Accept: application/vnd.docker.distribution.manifest.v2+json"
    curl -s -H $HEADER https://<HOST>/v2/<CATALOG>/tags/list
    
    Run Code Online (Sandbox Code Playgroud)
  2. 找到对应的SHA

    curl -sI -k -H $HEADER https://<HOST>/v2/<CATALOG>/manifests/<TAG> 
    
    Run Code Online (Sandbox Code Playgroud)
  3. 通过 SHA 删除

    curl -H $HEADER -X DELETE https://<HOST>/v2/<CATALOG>/manifests/<SHA>
    
    Run Code Online (Sandbox Code Playgroud)

...最后一个命令我得到 404:

404 page not found
Run Code Online (Sandbox Code Playgroud)

proxy当我对注册表配置中注释掉的位执行相同操作时,它可以工作。

这感觉非常熟悉,因为无法推动这样一个“通过缓存拉取”注册表,公平地说,这是有记录的。这个用例不是——或者是吗?

BMi*_*tch 7

图像的拉取缓存功能registry:2正是为拉取而设计的。任何其他操作(例如推送或删除)均不受支持,并且预计会出现错误。要从源删除清单,您需要针对该注册表运行删除命令。我不相信有任何 API 可以仅从缓存中过早地删除清单,它的过期时间是固定的 7 天。