如何通过命令行从Docker Hub中删除Docker镜像?

15

我在Jenkins流水线中创建Docker镜像进行测试,将其上传到Docker Hub并部署到Kubernetes。在测试过程结束时,我想从Docker Hub中删除测试镜像(而非测试机器上的镜像)。如何通过命令行删除Docker Hub镜像?


2
可能是如何删除Docker镜像?的重复问题。 - ipinak
13
这不是一个重复的问题。我想通过命令行从Docker Hub删除图像。 - codefx
原始版本没有说明这一点。 - ipinak
我已经想出了如何做到这一点。这是我最终编写的Python脚本:https://github.com/appscode/libbuild/blob/master/docker.py#L31 - codefx
4
哇,我简直不敢相信没有Docker命令行可以从注册表中删除镜像。 - wisbucky
这个问题涉及到Docker Hub以及它的API hub.docker.io,该API确实允许删除标签,就像我的回答中展示的那样。 - mirekphd
6个回答

12

请按照文档:https://docs.docker.com/v1.7/reference/api/docker-io_api/#delete-a-user-repository,使用Docker Hub API。

我刚刚用curl测试了删除测试镜像的操作:

curl -X DELETE -u "$user:$pass" https://index.docker.io/v1/repositories/$namespace/$reponame/

$user$pass替换为您在Docker Hub上的用户名和密码,分别将$namespace(在我的情况下与$user相同)和$reponame替换为图像名称(在我的情况下是test)。


2
这将删除整个图像。如何删除特定的标签? - codefx
目前API中没有删除特定标签的方法。 - Ricardo Branco
1
链接的文档已经失效。 - alper

9
你可以通过使用curl和REST API访问Docker Hub网站(位于https://hub.docker.com/v2/)而不是Docker Hub注册表(位于docker.io),从你的Docker Hub 中删除任何。因此,如果你不怕使用未记录的API,这一方法目前可行。
curl -i -X DELETE \
  -H "Accept: application/json" \
  -H "Authorization: JWT $HUB_TOKEN" \
  https://hub.docker.com/v2/repositories/<HUB_USERNAME>/<REPO>/tags/<TAG>/

HUB_TOKEN是一个JSON Web Token,通过Authorization HTTP头传递,可以通过将您的凭据以JSON格式发布到/v2/users/login/ Docker Hub端点来获取:

HUB_TOKEN=$(curl -s -H "Content-Type: application/json" -X POST -d "{\"username\": \"$HUB_USERNAME\", \"password\": \"$HUB_PASSWORD\"}" https://hub.docker.com/v2/users/login/ | jq -r .token)

2FA => 个人访问令牌

请注意,启用2FA后,您需要使用个人访问令牌(在使用2FA时API接受的唯一密码)。


1
当我这样做时,收到的是“403 Forbidden”(而不是“401 Unauthorized”)... - Thomas Hirsch
@ThomasHirsch,你能试着移除 "'${HUB_USERNAME}'""'${HUB_PASSWORD}'" 中的单引号吗?在更改后,我成功地删除了一个标签。 - 030
1
@030 谢谢,我已经在此期间解决了它。 - Thomas Hirsch
经过获取 HUB_TOKEN(在 2FA 下)的一些测试后,我消除了所有单引号,并转而使用更加复杂但绝对可行的双引号版本(在嵌套时进行转义)。 - mirekphd
这个可以工作,但是 API 已经更改为 https://hub.docker.com/v2/namespaces/<org>/repositories/<repo>/tags/<tag>参考链接 - pat-s

5

Dockerhub有一个REST后端接口,你可以使用它...只需跳过前端部分...

例如:

export USERNAME=myuser
export PASSWORD=mypass
export ORGANIZATION=myorg # (if it's personal, then it's your username)
export REPOSITORY=myrepo
export TAG=latest

curl -u $USERNAME:$PASSWORD -X "DELETE" https://cloud.docker.com/v2/repositories/$ORGANIZATION/$REPOSITORY/tags/$TAG/

这将删除一个标签...

在我的情况下,我有微服务,那么REPOSITORY = 微服务名称...

如果我想删除所有旧的镜像,我可以遍历这个....


我只收到{"detail": "Invalid username/password"}作为响应,尽管我已经仔细检查了用户名和密码。 - David Parks
2
@DavidParks 先生,您确定您所在的组织是正确的吗?另外,请检查您是否拥有足够的权限… ‍♂️ 可能是因为您没有足够的权限来访问特定的代码库… - Marco Vargas
2
后端API本来是不错的选择。看起来API可能已经被更改了。这个解决方案不再起作用了。至少,我没有让它工作。使用用户和密码的curl删除请求没有错误通过,但服务器没有响应。 - Alex Berger

1

这个进行过测试吗? - cestpasmoi
@cenestpamoi 你是什么意思?CLI工具是由Docker的开发人员构建的,虽然官方上还处于实验阶段,但总体上它确实可以使用。https://github.com/docker/hub-tool#readme - spkane
使用访问令牌在 GitHub Actions 上完美运行:https://github.com/sudo-bot/docker-rustpython/blob/53f16c3265db556be0248b45281180e319df492c/.github/workflows/publish.yml#L106 - William Desportes

1
任何 PowerShell 的朋友。
$params = @{username='mickey';password='minnie'}
$response = Invoke-RestMethod -Uri https://hub.docker.com/v2/users/login/ -Method POST -Body $params
$token = $response.token;

$orgName = "mickey" #organization or user name
$repoName = "disney"
$Uri = $("https://hub.docker.com/v2/repositories/$orgName/$repoName/")

Invoke-WebRequest -Method Delete -Uri $Uri -Headers @{Authorization="JWT " + $token; Accept= 'application/json' } 

0

这是可能的。为了快捷起见,在Chrome中打开开发工具,转到网络选项卡。手动从Docker Hub删除一个标签。您将在开发工具的网络选项卡中看到一个请求,该请求发送到https://cloud.docker.com/v2/repositories//tags/。只需右键单击该请求,复制,复制为Curl。它应该看起来像这样...

curl "https://cloud.docker.com/v2/repositories//tags//" -X DELETE -H 'Pragma: no-cache' -H 'Origin: https://cloud.docker.com' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US,en;q=0.9' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36' -H 'Accept: application/json' -H 'Cache-Control: no-cache' -H 'Referer: https://cloud.docker.com/user/repository/registry-1.docker.io/reponame/tags' -H 'Cookie: ' --compressed


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