docker - 删除旧的 docker 镜像,但不删除仍然引用的层

标签 docker

假设我有一台构建机器,可以构建许多 docker 镜像 myimage:myversion 。我每创建 100 个图像就会消耗大约 1GB 磁盘空间,而且我当然不需要全部。我想保留最近的 10 个图像(并删除所有较旧的图像),但我想确保拥有 10 个构建/图像中的所有缓存层。如果我缓存了所有层,那么我更有可能在下次运行时快速构建。

问题是所有图像(非常旧的和全新的)共享很多图层,因此我不能盲目删除旧图像,因为与新图像有大量重叠。

我不想使用docker image prune ( https://docs.docker.com/config/pruning/#prune-images )因为这取决于我拥有哪些容器(无论状态如何)并且正在删除容器,因此修剪最终会删除太多的东西。

是否有一个简单的命令可以定期运行以实现上述状态?

最佳答案

很简单,不,但是一些 shell 魔法是可能的。我认为这个 shell 脚本会做你想做的事:

#!/bin/sh
docker images --filter 'reference=myimage:*' \
              --format '{{ .CreatedAt }}/{{ .ID }}/{{ .Repository }}:{{ .Tag }}' \
  | sort -r \
  | tail +11 \
  | cut -d / -f 2 \
  | xargs docker rmi

(您可以尝试一次运行此一步,看看会出现什么结果。)

分成更小的部分:

  1. 以日期开头的格式列出所有 myimage:* 图像。 (如果您使用的是私有(private)注册表,则必须将注册表名称作为单独的部分包含在内,并且必须显式包含标签;例如,要列出所有 GCR 镜像,您需要 -f 'reference=gcr.io/*/*:*'.)
  2. 按日期对它们进行排序,最新的排在最前面。
  3. 跳过前 10 行并从第 11 行开始打印。
  4. 仅采用第二个斜杠分隔的字段(来自 --format 选项的是十六进制图像 ID)。
  5. 将其转换为 docker rmi 的命令行参数。

extended docker images documentation列出所有有效的 --format 选项。

关于docker - 删除旧的 docker 镜像,但不删除仍然引用的层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51975095/

相关文章:

Docker 上的 Wordpress : Could not create directory on mounted volume

Docker NodeRed 提交的容器不维护流和模块

docker - Docker容器如何相互访问

javascript - 在 apache 或 aws 上使用 docker 部署 React 构建

windows - 将 MongoDB 与 Docker 卷一起使用时,数据不会保存在数据库中吗?

docker - 为不同架构拉取 docker 镜像

linux - Linux 桌面上的 Kubernetes 开发人员设置

linux - 如何将 docker 容器连接到本地机器上的 Tor 代理?

docker - 使Python3和Node在同一容器中可用

docker - 私有(private) Docker 注册表/存储库的现代状态