缓存无效后如何删除已缓存/中间的Docker映像

时间:2018-07-31 11:21:26

标签: docker continuous-integration docker-image

我有一个CI管道,用于为管道的每次运行为我的应用程序构建docker映像(并且该管道是通过将代码推送到git存储库触发的。)

泊坞窗映像由几个中间层组成,这些中间层的大小逐渐变大。大多数中间映像在每次运行时都是相同的,因此可以大大利用docker的缓存机制。

但是,问题在于每次运行的最后几层是不同的,这是因为它们是由dockerfile中的COPY语句产生的,将构建的应用程序工件复制到映像中。由于工件在每次运行时都会被修改,因此已经缓存的最底端图像将始终无效。这些图像的大小均为800mb。

我可以使用什么docker命令来识别(并删除)这些被新映像替换的映像,即它们何时失效?

我想让我的CI管道在运行结束时删除它们,以免它们最终挂在CI服务器上而浪费大量磁盘空间。

1 个答案:

答案 0 :(得分:0)

如果我理解正确:每执行一次代码推送,CI管道就会创建新映像,并在其中部署新版本的应用程序。因此,以前创建的图像已过时,因此您要删除它。为此,您必须:

  1. 摆脱掉所有过时的容器,这些容器是根据过时的图像创建的

    • 使用命令docker ps -a显示所有容器
    • 如果仍在运行,请使用命令docker stop [containerID]停止过时的容器
    • command docker rm [containerID]删除它们
  2. 使用以下命令删除过时的图像:docker rmi [imageID]

总结为什么需要此过程:您无法删除任何图像,直到任何现有容器使用它为止(即使停止的容器仍然需要其图像)。因此,您应该先停止并删除旧容器,然后再删除旧图像。

检测部分和删除过程的自动化应该基于CI版本在创建新图像时生成的图像版本和容器名称。在不知道您的管道如何正常工作的情况下,很难提供任何具体的解决方案。

编辑1

要列出所有与任何标记图像都没有关系的图像,可以使用命令:docker images -f dangling=true。您可以使用以下命令将其删除:docker images purge

这里只需要记住一件事:如果您在未标记图像的情况下构建图像,该图像将出现在“悬空”图像列表中。您可以通过在构建标签时提供标签来避免这种情况。