共计 1143 个字符,预计需要花费 3 分钟才能阅读完成。
需求背景:
项目打包成功后上传到私服,本地就没有存在的必要了,进行镜像清理,节约磁盘空间,
shell 脚本如下:
#!/bin/bash
prefix="reg.g6k.cn/bt/"
# 明确保留的 repository:tag
whitelist=(
"reg.g6k.cn/bt/openjdk:11-base"
"reg.g6k.cn/bt/go:base-v2"
)
# 创建 whitelist 的映射表
declare -A whitelist_map
for item in "${whitelist[@]}"; do
whitelist_map["$item"]=1
done
# 收集所有待删除项
mapfile -t image_lines < <(docker images --format '{{.Repository}}:{{.Tag}} {{.ID}}' | grep "^$prefix")
declare -A image_ids_to_delete
for line in "${image_lines[@]}"; do
repo_tag=$(echo "$line" | awk '{print $1}')
image_id=$(echo "$line" | awk '{print $2}')
if [[ -n "${whitelist_map[$repo_tag]}" ]]; then
echo "✅ 保留白名单镜像: $repo_tag"
else
echo "🗑️ 标记删除镜像: $repo_tag ($image_id)"
image_ids_to_delete["$image_id"]=1
fi
done
# 执行删除
echo
echo "🚀 开始删除镜像..."
for id in "${!image_ids_to_delete[@]}"; do
echo "→ 删除镜像 ID: $id"
docker rmi -f "$id" || echo "⚠️ 删除失败,可能该镜像被容器引用: $id"
done
echo
echo "✅ 脚本执行完毕,总计尝试删除 ${#image_ids_to_delete[@]} 个镜像 ID。"
清理镜像后有时候可能磁盘并不会释放空间。可以使用下面命令查看具体情况。
[root@ops-jenkins-01 ]$docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 12 0 4.919GB 4.919GB (100%)
Containers 0 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 44 0 0B 0B
不释放的情况下 Build Cache 会占用大量的空间,需要执行下面的命令来进行缓存清理
docker builder prune
用于清理这些不再使用的构建器资源,以释放磁盘空间。它会删除不再使用的构建器、
构建器缓存和构建日志等资源,但会保留正在使用的构建器
微信扫描下方的二维码阅读本文
正文完