docker - 如何从私有(private) Docker 注册表中删除图像?

标签 docker docker-registry

我运行一个私有(private) docker 注册表,我想从存储库中删除除 latest 之外的所有图像。我不想删除整个存储库,只是其中的一些图像。 API docs没有提到这样做的方法,但肯定有可能吗?

最佳答案

目前您无法使用 Registry API 来执行该任务。它只允许您删除存储库或特定标签。

通常,删除存储库意味着删除与该存储库关联的所有标签。

删除标签意味着删除图像和标签之间的关联。

以上都不会删除单个图像。它们留在您的磁盘上。


解决方法

对于此解决方法,您需要将 docker 镜像存储在本地。

您的解决方案的解决方法是删除除最新标签之外的所有标签,从而可能删除对关联图像的引用。然后你可以运行 this script 删除所有未被任何标签引用或任何已使用图像的祖先的图像。

术语(图片和标签)

考虑这样的图像图,其中大写字母(AB、...)表示短图像 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/

相关文章:

azure - 如何将SSL添加到Azure容器实例应用程序?

node.js - 带有 jenkins 插件的 Nodejs 在 alpine 图像中无法执行并显示 "symbol not found"

docker - 本地存储镜像的Docker可移植性问题

image - 使用docker镜像存储数据文件

docker - 在 swarm 中运行时无法从私有(private)注册表中推送/拉取

docker - 在Docker容器中运行Scrapy

docker - 更新后,Confluence on Docker在现有安装上运行安装助手

postgresql - Docker PostgreSQL:初始化脚本

docker - 如何使用Podman将镜像推送到Docker注册表

docker - 从我拥有的存储库中提取 Docker 镜像时访问被拒绝