使用版本
测试版本: registry-2.4.1
镜像删除步骤
1、通过 /v2/<镜像名称 >/manifests/<tag >的方式获取镜像的digest注意获取的请求头中需要加Accept: application/vnd.docker.distribution.manifest.v2+json否则获取不到正确的digest(虽然也能够获取到一个digest,但是之后的删除操作会失败)没加那个header值导致失败的返回值是:404{"errors":[{"code":"MANIFEST_UNKNOWN","message":"manifest unknown"}2、删除镜像DELETE /v2/<name>/manifests/<reference>
ps:我因为有加认证的服务,所以获取digest和删除操作之前都会去认证服务获取token才能操作。
删除时容易出现的问题
1、镜像删除不完整,只有manifests被删除了 ,详细见:https://github.com/docker/distribution/issues/17552、未在registry的配置文件中配置
delete:
enabled:true
完整问题参见:http://dockone.io/question/883
3、registry 配置可能出现的问题,参考官网配置文件介绍: https://docs.docker.com/registry/configuration/#delete4、镜像无法完全被删除,删除的只是tag信息以及相关联的manifest实际通过_catlog获取该镜像的repository还是存在的。但是查询tag确实不存在被删除的tag信息了。(如果要删除这个目录,估计只能手动删除文件目录了,不过这样会导致相关联的layer被破坏)
官网介绍
Deleting an Image
通过name
和
reference
删除镜像.删除的api为如下(DELETE方式,而不是post 或者get):
DELETE /v2/<name>/manifests/<reference>
对于删除, reference必须是镜像的
digest否则会失败. 假如存在镜像并且被成功删除,则返回如下响应(response)
202 Accepted
Content-Length: None
实际测试返回(使用postman):
Status 202 Accepted
返回值body :(空)
返回值headers:
Content-Length →
0
Content-Type →
text/plain; charset=utf-8
Date →
Thu, 03 Nov 2016 09:16:19 GMT
Docker-Distribution-Api-Version →
registry/2.0
X-Content-Type-Options →
nosniff
假如镜像已经被删除,则响应http状态为: 404 Not Found
注意 删除manifest时,版本是2.3或者更高版本,通过
HEAD
或者
GET方式
获取digest时候需要在请求头header中加如下请求头(否则会删除失败):
Accept: application/vnd.docker.distribution.manifest.v2+json