docker - 缓存失效后如何删除缓存/中间 docker 图像
问题描述
我有一个 CI 管道,它为我的应用程序为管道的每次运行构建一个 docker 映像(并且管道由向 git 存储库的代码推送触发。)
docker 镜像由几个中间层组成,这些中间层逐渐变得非常大。每次运行的大多数中间图像都是相同的,因此 docker 的缓存机制得到了充分利用。
但是,问题在于每次运行的最后几层都不同,因为它们是由 dockerfile 中的 COPY 语句产生的,其中构建的应用程序工件被复制到映像中。由于每次运行都会修改工件,因此已缓存的最底部图像将始终无效。这些图像每个大小为 800mb。
我可以使用什么 docker 命令来识别(和删除)这些被新图像替换的图像,即当它们失效时?
我想让我的 CI 管道在运行结束时删除它们,这样它们就不会最终挂在 CI 服务器上并浪费大量磁盘空间。
解决方案
如果我理解正确:每次代码推送时,CI 管道都会创建新映像,并在其中部署新版本的应用程序。结果,先前创建的图像变得过时,因此您想将其删除。为此,您必须:
- 摆脱所有过时的容器,这些容器是从过时的图像创建的
- 使用命令显示所有容器
docker ps -a
- 如果仍在运行,请使用命令停止过时的容器
docker stop [containerID]
- 删除它们
command docker rm [containerID]
- 使用命令删除过时的图像:
docker rmi [imageID]
总结一下为什么需要这个过程:你不能删除任何图像,直到它被任何现有容器使用(即使停止的容器仍然需要它们的图像)。为此,您应该先停止并移除旧容器,然后再移除旧镜像。
检测部分和删除过程的自动化应基于 CI 管道在创建新图像时生成的图像版本和容器名称。
编辑 1
要列出与任何标记图像无关的所有图像,您可以使用命令:docker images -f dangling=true
。您可以使用以下命令删除它们:docker images purge
。
这里只需要记住一件事:如果您构建一个图像而不标记它,该图像将出现在“悬空”图像列表中。您可以通过在构建时提供标签来避免这种情况。
编辑 2
图像清除命令已更改。现在正确的命令是:
docker image prune
这是一个文档链接
推荐阅读
- sql-server - MSSQL 创建动态列
- java - 如何在 Spring Boot 的 main 方法中创建存储库实例?
- javascript - 重新格式化数据以以特定方式显示
- r - 图例中的空白,同时(使用中断参数)在 R 中使用 plot() 绘制 rasterLayer
- javascript - 如何通过忽略每次按键上的无效字符来使文本类型的输入元素只接受一个数值(十进制、正数和负数)?
- excel - 从来自表的 ComboBox 中删除重复项 - Excel VBA
- swift - Swift:从 CollectionView 单元中获取 UIImageView
- pytorch - 为什么torch.autograd.grad() 使用torch.cat 返回None?
- automation - 任何人都可以帮助我使用 jmeter 中的录制控制器录制脚本吗?
- angular - Angular订阅另一个组件中的变量更改