在持续集成环境中构建docker镜像时,您很快就会耗尽磁盘空间并需要删除旧图像。但是,您无法删除所有旧图像,包括中间图像,因为这会中断缓存。
如何在不破坏缓存的情况下避免构建代理程序中的磁盘空间不足?
答案 0 :(得分:1)
我的解决方案是在构建新图像后删除以前版本的图像。这可确保缓存的图像可用于加速构建,但避免堆积旧图像并占用磁盘空间。此方法依赖于具有唯一标记的图像的每个版本。
这是我的脚本(gist here):
#!/usr/bin/env bash
usage(){
# ============================================================
echo This script removes all images of the same repository and
echo older than the provided image from the docker instance.
echo
echo This cleans up older images, but retains layers from the
echo provided image, which makes them available for caching.
echo
echo Usage:
echo
echo '$ ./delete-images-before.sh <image-name>:<tag>'
exit 1
# ============================================================
}
[[ $# -ne 1 ]] && usage
IMAGE=$(echo $1 | awk -F: '{ print $1 }')
TAG=$(echo $1 | awk -F: '{ print $2 }')
FOUND=$(docker images --format '{{.Repository}}:{{.Tag}}' | grep ${IMAGE}:${TAG})
if ! [[ ${FOUND} ]]
then
echo The image ${IMAGE}:${TAG} does not exist
exit 2
fi
docker images --filter before=${IMAGE}:${TAG} \
| grep ${IMAGE} \
| awk '{ print $3 }' \
| xargs --no-run-if-empty \
docker --log-level=warn rmi --force || true
答案 1 :(得分:1)
我们用来处理此问题的工具是docker custodian(dcgc)。
建议您保留要保留的图像列表,并且永远不要清理并将其传递给--exclude-image
(如果您正在使用puppet
或其他一些资源管理系统,将文件写入包含图像模式的磁盘可能更有用,而是使用--exclude-image-file
)