如何在缓存失效后删除缓存/中间 docker 图像

Oma*_*yas 7 continuous-integration docker docker-image

我有一个 CI 管道,它为我的应用程序为管道的每次运行构建一个 docker 映像(管道由代码推送到 git 存储库触发。)

docker 镜像由几个中间层组成,这些层的大小逐渐变得非常大。每次运行的大多数中间图像都是相同的,因此显着利用了 docker 的缓存机制。

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

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

我想让我的 CI 管道在运行结束时将它们删除,这样它们就不会在 CI 服务器上晃来晃去并浪费大量磁盘空间。

Tin*_*nki 12

如果我理解正确:每次推送代码时,CI 管道都会创建新映像,其中部署了新版本的应用程序。因此,之前创建的图像会过时,因此您需要将其删除。为此,您必须:

  1. 摆脱所有过时的容器,这些容器是从过时的图像中创建的
  • 使用命令显示所有容器 docker ps -a
  • 如果仍在运行,请使用命令停止过时的容器 docker stop [containerID]
  • 删除它们 command docker rm [containerID]
  1. 使用命令删除过时的图像: docker rmi [imageID]

总结一下为什么需要这个过程:你不能删除任何图像,直到它被任何现有容器使用(即使停止的容器仍然需要它们的图像)。出于这个原因,您应该首先停止并删除旧容器,然后再删除旧图像。

检测部分和删除过程的自动化应该基于 CI 管道在创建新镜像时生成的镜像版本和容器名称。

编辑 1

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

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

编辑 2

图像清除命令已更改。现在正确的命令是:

docker image prune
Run Code Online (Sandbox Code Playgroud)

这是一个带有文档的链接

  • 看起来现在我们应该使用 `docker image prune` 而不是 `docker images purge` (2认同)