我有一个CI管道,用于为管道的每次运行为我的应用程序构建docker映像(并且该管道是通过将代码推送到git存储库触发的。)
泊坞窗映像由几个中间层组成,这些中间层的大小逐渐变大。大多数中间映像在每次运行时都是相同的,因此可以大大利用docker的缓存机制。
但是,问题在于每次运行的最后几层是不同的,这是因为它们是由dockerfile中的COPY语句产生的,将构建的应用程序工件复制到映像中。由于工件在每次运行时都会被修改,因此已经缓存的最底端图像将始终无效。这些图像的大小均为800mb。
我可以使用什么docker命令来识别(并删除)这些被新映像替换的映像,即它们何时失效?
我想让我的CI管道在运行结束时删除它们,以免它们最终挂在CI服务器上而浪费大量磁盘空间。
答案 0 :(得分:0)
如果我理解正确:每执行一次代码推送,CI管道就会创建新映像,并在其中部署新版本的应用程序。因此,以前创建的图像已过时,因此您要删除它。为此,您必须:
摆脱掉所有过时的容器,这些容器是根据过时的图像创建的
docker ps -a
显示所有容器docker stop [containerID]
停止过时的容器command docker rm [containerID]
删除它们使用以下命令删除过时的图像:docker rmi [imageID]
总结为什么需要此过程:您无法删除任何图像,直到任何现有容器使用它为止(即使停止的容器仍然需要其图像)。因此,您应该先停止并删除旧容器,然后再删除旧图像。
检测部分和删除过程的自动化应该基于CI版本在创建新图像时生成的图像版本和容器名称。在不知道您的管道如何正常工作的情况下,很难提供任何具体的解决方案。
编辑1
要列出所有与任何标记图像都没有关系的图像,可以使用命令:docker images -f dangling=true
。您可以使用以下命令将其删除:docker images purge
。
这里只需要记住一件事:如果您在未标记图像的情况下构建图像,该图像将出现在“悬空”图像列表中。您可以通过在构建标签时提供标签来避免这种情况。