删除在Github Package Registry上推送的图像的方法
下结论
如果我先从结论开始写的话,在公共仓库的情况下,我无法自己删除已经推送的图像!如果非常必要,似乎只能通过填写这里提供的表格联系管理员请他们帮忙…
开端
Github包注册根本不知不觉就能用了,我立马把随意的镜像上传试试!
↓
上传成功了!
嗯?ansible?
啊啊…啊啊啊,我发现有个打字错误!!
先删除它吧!可是怎么删除呢?我想删除,但是怎么找不到删除选项呢?在Docker的子命令里也没有类似的选项,怎么办?所以我开始查找,结果发现这个问题意外地麻烦。
在 GraphQL 上的努力之旅…
首先,可以使用 GitHub GraphQL 的 deletePackageVersion 变异来删除 API。
然而因为不知道该如何实施它,所以我在Google上搜索…然后在查阅文档中的输入和返回字段规范的同时,我发现应该发出以下类似的查询。
curl -sL -XPOST https://api.github.com/graphql \
-H "Authorization: bearer $TOKEN" \
-H 'Accept: application/vnd.github.package-deletes-preview+json' \
-d '{"query":"mutation{deletePackageVersion(input:{clientMutationId: \"1\",packageVersionId:\"XXXXX\"}){clientMutationId,success}}"}'
由于不太明白,我来写出来,POST的JSON查询以及GraphQL和响应如下。
我不太清楚要指定什么样的输入值,所以我随便输入了一些值,结果被批评了一番。顺便提一下,clientMutationId应该是任何值都可以(可能是传递给请求和响应的用于唯一标识用户的值),但是我并不了解应该指定什么样的值给packageVersionId……暂时先随便试一下。
mutation {
deletePackageVersion(
input:{
clientMutationId: "1",
packageVersionId: "XXXXX"
}
)
{
clientMutationId,
success
}
}
GraphQL查询响应的示例。
{
"data": {
"deletePackageVersion": null
},
"errors": [
{
"type": "NOT_FOUND",
"path": [
"deletePackageVersion"
],
"locations": [
{
"line": 1,
"column": 10
}
],
"message": "Could not resolve to a node with the global id of 'XXXXX'"
}
]
}
就先不管那個難以理解的信息,再次考慮packageVersionId。我先試試latest、ansibke:latest還有kawaz/docker-ansible/ansibke:latest這些值,但都返回404……。
再次查看關於packageVersionId的文檔,發現它是一個Base64編碼的獨特值。明白了,這東西我不懂。或者我們應該先送一個GET請求去尋找內部ID之類的,然後找到相應的API來獲取包列表。所以我開始尋找能夠獲取包列表的API。
边阅读文档和尝试API,我终于搞明白了…嘿,GraphQL真是够复杂的啊。要想获取想要的字段,必须一个个查找并列举出来,太麻烦了…于是我就放弃了。
curl -sL -X POST https://api.github.com/graphql \
-H "Authorization: bearer $TOKEN" \
-d '{"query":"query{repository(owner:\"kawaz\",name:\"docker-ansible\"){registryPackages(first:10){nodes{packageType,registryPackageType,name,nameWithOwner,
id,versions(first:10){nodes{id,version,readme}}}}}}"}'
query {
repository(owner:"kawaz", name:"docker-ansible") {
registryPackages(first:10) {
nodes {
packageType,
registryPackageType,
name,
nameWithOwner,
id,
versions(first:10) {
nodes{
id,
version,
readme
}
}
}
}
}
}
GraphQL查询的响应。
{
"data": {
"repository": {
"registryPackages": {
"nodes": [
{
"packageType": "DOCKER",
"registryPackageType": "docker",
"name": "ansibke",
"nameWithOwner": "kawaz/ansibke",
"id": "MDE1OlJlZ2lzdHJ5UGFja2FnZTQxNDM3",
"versions": {
"nodes": [
{
"id": "MDIyOlJlZ2lzdHJ5UGFja2FnZVZlcnNpb24xNzc3MTY=",
"version": "docker-base-layer",
"readme": "あああ。。。イメージ名 typo しとる…。"
}
]
}
},
{
"packageType": "DOCKER",
"registryPackageType": "docker",
"name": "ansible",
"nameWithOwner": "kawaz/ansible",
"id": "MDE1OlJlZ2lzdHJ5UGFja2FnZTQxNDQw",
"versions": {
"nodes": [
{
"id": "MDIyOlJlZ2lzdHJ5UGFja2FnZVZlcnNpb24xNzc3MzA=",
"version": "latest",
"readme": null
},
{
"id": "MDIyOlJlZ2lzdHJ5UGFja2FnZVZlcnNpb24xNzc3Mjk=",
"version": "2.8.4",
"readme": null
},
{
"id": "MDIyOlJlZ2lzdHJ5UGFja2FnZVZlcnNpb24xNzc3Mjc=",
"version": "docker-base-layer",
"readme": null
}
]
}
}
]
}
}
}
}
啊啦啦,GraphQL真让人烦啊!!不过终于出现了我想要的类似ID的东西。那就尝试把它用在第一个删除查询中吧!
curl -sL -XPOST https://api.github.com/graphql \
-H "Authorization: bearer $TOKEN" \
-H 'Accept: application/vnd.github.package-deletes-preview+json' \
-d '{"query":"mutation{deletePackageVersion(input:{clientMutationId: \"1\",packageVersionId:\"MDIyOlJlZ2lzdHJ5UGFja2FnZVZlcnNpb24xNzc3MTY=\"}){clientMutationId,success}}"}'
所以,最终删除查询的响应形式发生了变化!这是一个胜利的机会吗??? 啊啊啊啊啊啊啊啊。
{
"data": {
"deletePackageVersion": null
},
"errors": [
{
"type": "UNPROCESSABLE",
"path": [
"deletePackageVersion"
],
"locations": [
{
"line": 1,
"column": 11
}
],
"message": "Public package versions are not eligible for deletion. For more on our deletion policy, see https://help.github.com/articles/about-github-package-registry/#deleting-a-package."
}
]
}
我們原本有個政策,說公開的套餐我們不會刪除的。但是我們經過了很多困難,最後的結論是我們無法刪除它!如果你真的需要,請從這裡聯絡我們。
嗯,这次的工作让我对GraphQL有了一些模糊的理解,就算是好事吧…