我运行一个私有(private) docker 注册表,我想从存储库中删除除 latest
之外的所有图像。我不想删除整个存储库,只是其中的一些图像。 API docs没有提到这样做的方法,但肯定有可能吗?
最佳答案
目前您无法使用 Registry API 来执行该任务。它只允许您删除存储库或特定标签。
通常,删除存储库意味着删除与该存储库关联的所有标签。
删除标签意味着删除图像和标签之间的关联。
以上都不会删除单个图像。它们留在您的磁盘上。
解决方法
对于此解决方法,您需要将 docker 镜像存储在本地。
您的解决方案的解决方法是删除除最新标签之外的所有标签,从而可能删除对关联图像的引用。然后你可以运行 this script 删除所有未被任何标签引用或任何已使用图像的祖先的图像。
术语(图片和标签)
考虑这样的图像图,其中大写字母(A
、B
、...)表示短图像 ID,<-
表示一张图片基于另一张图片:
A <- B <- C <- D
现在我们给图片添加标签:
A <- B <- C <- D
| |
| <version2>
<version1>
这里,标签 <version1>
引用图片 C
和标签 <version2>
引用图片 D
.
完善您的问题
在你的问题中你说你想删除
all images but the
latest
。现在,这个术语并不完全正确。您混合了图像和标签。查看图表我想你会同意标签 <version2>
代表最新版本。事实上,根据 this question你可以有一个代表最新版本的标签:
A <- B <- C <- D
| |
| <version2>
| <latest>
<version1>
自从 <latest>
标签引用图片 D
我问你:你真的要删除除图像之外的所有内容D
?应该不会吧!
如果删除标签会发生什么?
如果您删除标签 <version1>
使用 Docker REST API 你会得到这个:
A <- B <- C <- D
|
<version2>
<latest>
记住: Docker 永远不会删除图像!即使这样做了,在这种情况下它也无法删除图像,因为图像 C
是图像 D
的祖先的一部分已标记。
即使你使用 this script ,不会删除任何图像。
什么时候可以删除图片
在您可以控制某人何时可以拉取或推送到您的注册表的条件下(例如,通过禁用 REST 接口(interface))。如果没有其他图像基于该图像并且没有标签引用它,您可以从图像图中删除该图像。
请注意,在下图中,图像 D
不是基于C
但在 B
.因此,D
不依赖于 C
.如果您删除标签 <version1>
在此图中,图像 C
不会被任何图像和 this script 使用 可以删除它。
A <- B <--------- D
\ |
\ <version2>
\ <latest>
\ <- C
|
<version1>
清理后,您的图像图如下所示:
A <- B <- D
|
<version2>
<latest>
这是你想要的吗?
关于docker - 如何从私有(private) Docker 注册表中删除图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25436742/