使用版本

测试版本: 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/1755
2、未在registry的配置文件中配置

delete:

enabled:true

完整问题参见:http://dockone.io/question/883
3、registry 配置可能出现的问题,参考官网配置文件介绍: https://docs.docker.com/registry/configuration/#delete
4、镜像无法完全被删除,删除的只是tag信息以及相关联的manifest实际通过_catlog获取该镜像的repository还是存在的。
但是查询tag确实不存在被删除的tag信息了。(如果要删除这个目录,估计只能手动删除文件目录了,不过这样会导致相关联的layer被破坏)

 官网介绍

Deleting an Image

 通过namereference删除镜像.删除的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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐