从Docker Registry V2中删除镜像

6
Docker Registry v2有一个API端点可以删除镜像。
DELETE /v2/<name>/manifests/<reference>

https://github.com/docker/distribution/blob/master/docs/spec/api.md#deleting-an-image

但是文档中提到:

删除时,必须使用digest作为参考,否则将无法删除。

事实上,使用标签(tag)是行不通的,并且会返回“405操作不支持”。

问题在于,似乎没有端点可以获取图像的digest。

列出图像和标签的端点只列出了它们。

尝试使用以下命令获取清单:

GET /v2/<name>/manifests/<reference>    

当我使用tag作为<引用>时,我发现一个名为Docker-Content-Digest的头部被设置了一个digest。文档中指出这个digest是:

Docker-Content-Digest:请求目标内容的摘要。

而正文中包含一堆blobSum: <digest>

如果我尝试使用标头的digest值,使用:

GET /v2/<name>/manifests/<reference>

当我将digest作为<reference>使用时,返回了404错误。

digest的格式如下:sha256:6367f164d92eb69a7f4bf4cab173e6b21398f94984ea1e1d8addc1863f4ed502

我尝试过带有和不带有sha256前缀,但都没有成功。

那么,我应该如何获取要删除的镜像的digest以进行删除操作呢?


1
这是一份对你有用的文档:https://github.com/docker/distribution/issues/1821 - BMW
1
确实有用...但这是获取摘要ID的唯一方式,有点疯狂。 - MrE
2个回答

2
curl -u login:password -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET https://registry.private.com/v2/<name>/manifests/<tag>

JSON > 配置文件 > 摘要


0

目前在Docker API中不是一个简单的操作,但我希望这个过程能够有所帮助:

  1. 创建一个文件并给它命名,对我来说它将是delete-image.sh

    #!/bin/bash
    # 参考:https://gist.github.com/jaytaylor/86d5efaddda926a25fa68c263830dac1
    
    set -o errexit
    
    if [ -z "$1" ]
      then
        echo "错误:必须提供镜像名称参数"
        exit 1
    fi
    
    
    registry='localhost:5000'
    name=$1
    
    curl -v -sSL -X DELETE "http://${registry}/v2/${name}/manifests/$(
        curl -sSL -I \
            -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
                "http://${registry}/v2/${name}/manifests/$(
                curl -sSL "http://${registry}/v2/${name}/tags/list" | jq -r '.tags[0]'
            )" \
        | awk '$1 == "Docker-Content-Digest:" { print $2 }' \
        | tr -d $'\r' \
    )"
    
  2. 授予该文件权限以便执行;

    sudo chmod u+x ./delete-image.sh
    ./delete-image.sh <your-image-name>
    
  3. 删除镜像后,收集垃圾;

    docker exec -it registry.localhost bin/registry \
        garbage-collect /etc/docker/registry/config.yml
    
  4. 现在删除该镜像的文件夹(我假设您之前创建了一个卷);

    sudo rm -rf ${HOME}/registry/docker/registry/v2/repositories/<your-image-name>
    
  5. 如果您没有创建卷,您可能需要进入容器删除该文件夹。但无论如何,重新启动容器都是个好主意;

    docker restart registry.localhost
    

不建议在生产环境中使用该过程

希望未来 Docker API 能够原生支持这些操作,提供更好的支持。


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