从docker注册表v2中删除图像

时间:2016-08-05 17:54:53

标签: docker

Docker Registry v2有一个用于删除图像的API端点

DELETE /v2/<name>/manifests/<reference>

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

然而,医生说:

  

对于删除,引用必须是摘要,否则删除将失败。

确实,使用tag不起作用并返回405 Operation Not Supported

问题是,似乎没有任何端点可以获取图像的digest

列出图像的端点和标签仅列出那些。

尝试使用

获取清单
GET /v2/<name>/manifests/<reference>    

使用tag作为<reference>我看到Docker-Content-Digest标头设置为digest,文档说是

  

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

虽然正文包含一堆blobSum: <digest>

如果我尝试使用Header摘要值,使用

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

digest<reference>,我得到404

digest看起来像是:sha256:6367f164d92eb69a7f4bf4cab173e6b21398f94984ea1e1d8addc1863f4ed502

我尝试使用和不使用sha256前缀。但没有运气

那么我应该如何获取要删除的图片的digest,将其删除?

2 个答案:

答案 0 :(得分: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&gt; config&gt;消化

答案 1 :(得分:0)

现在在 Docker API 中不是一个微不足道的操作,但我希望这个过程有帮助:

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

    #!/bin/bash
    # Inspired by: https://gist.github.com/jaytaylor/86d5efaddda926a25fa68c263830dac1
    
    set -o errexit
    
    if [ -z "$1" ]
      then
        echo "Error: The image name arg is mandatory"
        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 中能够更好地原生支持这些操作。