删除较旧的Docker映像,但不删除仍参考的图层

时间:2018-08-22 21:03:44

标签: docker

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

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

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

有没有可以定期运行的简单命令来达到上述状态?

1 个答案:

答案 0 :(得分:3)

简单,没有,但是可以使用一些shell向导。我认为这个shell脚本可以满足您的要求:

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

(您可以尝试一次运行此步骤以查看结果如何。)

小块:

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

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