我在Jenkins流水线中创建Docker镜像进行测试,将其上传到Docker Hub并部署到Kubernetes。在测试过程结束时,我想从Docker Hub中删除测试镜像(而非测试机器上的镜像)。如何通过命令行删除Docker Hub镜像?
我在Jenkins流水线中创建Docker镜像进行测试,将其上传到Docker Hub并部署到Kubernetes。在测试过程结束时,我想从Docker Hub中删除测试镜像(而非测试机器上的镜像)。如何通过命令行删除Docker Hub镜像?
请按照文档: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
)。
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接受的唯一密码)。
"'${HUB_USERNAME}'"
和 "'${HUB_PASSWORD}'"
中的单引号吗?在更改后,我成功地删除了一个标签。 - 030https://hub.docker.com/v2/namespaces/<org>/repositories/<repo>/tags/<tag>
。参考链接 - pat-sDockerhub有一个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 Parkshttps://docs.docker.com/docker-hub/api/latest/
"并且还有一些其他选项,包括docker-hub
CLI工具。"hub-tool login
hub-tool tag rm myrepo/myimage:mytag
$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' }
这是可能的。为了快捷起见,在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
hub.docker.io
,该API确实允许删除标签,就像我的回答中展示的那样。 - mirekphd