我运行了一个私有Docker注册表,我想latest从存储库中删除除之外的所有图像。我不想删除整个存储库,仅删除其中的一些图像。该API文档不提一个办法做到这一点,但肯定这是可能的?
latest
当前,您无法将注册表API用于该任务。它仅允许您删除存储库或特定标签。
通常,删除存储库意味着删除与此仓库关联的所有标签。
删除标签意味着删除图像和标签之间的关联。
以上所有都不删除单个图像。它们留在您的磁盘上。
对于此解决方法,您需要将docker映像存储在本地。
解决方案的一种解决方法是删除除最新标签以外的所有标签,从而潜在地删除对关联图像的引用。然后,您可以运行 此脚本 来删除所有图像,这些图像未被任何标签或任何已使用图像的祖先所引用。
考虑一个这样的图像图,其中大写字母(A,,B…)表示短图像ID,<-表示一个图像基于另一幅图像:
A
B
<-
A <- B <- C <- D
现在,我们向图片添加标签:
A <- B <- C <- D | | | <version2> <version1>
在此,标签<version1>引用图像C,标签<version2>引用图像D。
<version1>
C
<version2>
D
在您的问题中,您说过您想删除
所有图片,但 latest
。现在,该术语不太正确。您已经混合了图像和标签。查看图表,我想您会同意该标记<version2>代表最新版本。实际上,根据此问题,您可以具有代表最新版本的标签:
A <- B <- C <- D | | | <version2> | <latest> <version1>
由于<latest>标签引用了图像,D所以我问您:除了图像之外,您是否真的要删除所有内容D?可能不是!
<latest>
如果<version1>使用Docker REST API 删除标签,则会得到以下信息:
A <- B <- C <- D | <version2> <latest>
切记: Docker永远不会删除映像!即使这样做,在这种情况下也无法删除图像,因为该图像C是D被标记图像的祖先的一部分。
即使使用 此脚本 ,也不会删除任何图像。
在您可以控制某人何时可以拉入或推入注册表的条件下(例如,通过禁用REST接口)。如果没有其他图像基于该图像并且没有标签引用该图像,则可以从图像图中删除该图像。
请注意,下面的图,该图像D是 没有 根据C,但对B。因此,D不依赖C。如果删除<version1>该图中的标记,则该图像C将不会被任何图像使用,并且 此脚本 可以将其删除。
A <- B <--------- D \ | \ <version2> \ <latest> \ <- C | <version1>
清理后,您的图像图如下所示:
A <- B <- D | <version2> <latest>
这是你想要的吗?