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
,将其删除?
答案 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 中不是一个微不足道的操作,但我希望这个过程有帮助:
创建一个文件并给它一个名字,对我来说就是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' \
)"
授予该文件的权限,使其可以执行;
sudo chmod u+x ./delete-image.sh
./delete-image.sh <your-image-name>
删除图片后,收集垃圾;
docker exec -it registry.localhost bin/registry \
garbage-collect /etc/docker/registry/config.yml
现在删除该图像的文件夹(我假设您之前创建了一个卷);
sudo rm -rf ${HOME}/registry/docker/registry/v2/repositories/<your-image-name>
如果您尚未创建卷,则可能必须进入容器才能删除该文件夹。但是,无论如何,重新启动容器是个好主意;
docker restart registry.localhost
不建议将程序用于生产环境。
我希望我们将来在 Docker API 中能够更好地原生支持这些操作。