假设我有一台构建机器,可以构建许多 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
(您可以尝试一次运行此一步,看看会出现什么结果。)
分成更小的部分:
- 以日期开头的格式列出所有
myimage:*
图像。 (如果您使用的是私有(private)注册表,则必须将注册表名称作为单独的部分包含在内,并且必须显式包含标签;例如,要列出所有 GCR 镜像,您需要-f 'reference=gcr.io/*/*:*'
.) - 按日期对它们进行排序,最新的排在最前面。
- 跳过前 10 行并从第 11 行开始打印。
- 仅采用第二个斜杠分隔的字段(来自
--format
选项的是十六进制图像 ID)。 - 将其转换为
docker rmi
的命令行参数。
extended docker images
documentation列出所有有效的 --format
选项。
关于docker - 删除旧的 docker 镜像,但不删除仍然引用的层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51975095/