docker_clean_all
彻底清理 Docker 容器/镜像/目录
一键脚本
bash <(curl -sL gitee.com/meimolihan/linux-command_sh/raw/master/docker_clean_all.sh) /vol1/xxx
效果预览
补充说明
该脚本为 Shell 脚本通用工具函数库,提供一组可复用的基础函数,用于美化输出、交互控制、Docker 环境清理等场景。直接执行该脚本会自动加载所有工具函数,适合在其他脚本开头 source 使用。
函数说明
| 函数 | 说明 |
|---|---|
list_color_init |
初始化 9 种颜色变量(灰色/红/绿/黄/蓝/白/紫/亮青/重置) |
log_info |
输出蓝色 [信息] 前缀日志 |
log_ok |
输出绿色 [成功] 前缀日志 |
log_warn |
输出黄色 [警告] 前缀日志 |
log_error |
输出红色 [错误] 前缀日志(输出到 stderr) |
sleep_fractional |
支持小数秒的休眠(依次尝试 sleep、perl、python3、python,最后取整回退) |
exit_script |
显示渐变动画后 clear 退出脚本 |
handle_y_n |
Y/N 输入错误时的提示处理(三色闪烁提示,return 2) |
break_end |
操作完成提示,按任意键继续并清屏 |
remove_deployment_dir |
安全删除指定部署目录(带不存在/失败提示) |
docker_clean_all |
Docker 环境彻底清理:停止并删除所有容器 → 删除所有镜像 → 可选删除部署目录 |
传参说明
| 方式 | 命令示例 | 说明 |
|---|---|---|
| docker_clean_all 不传参 | docker_clean_all |
仅清理容器和镜像,不删除额外目录 |
| docker_clean_all 传目录 | docker_clean_all /vol1/1000/compose |
清理容器和镜像后,额外删除指定部署目录 |
注意事项
- 颜色变量使用
export导出,source 引入后可在父脚本中直接使用 sleep_fractional通过多种后备方案实现小数秒精度,兼容老旧系统docker_clean_all为高危操作,会删除全部容器和镜像,请谨慎使用- 所有函数均以标准输出/错误输出打印,适合在各类脚本中调用
- 建议在其他脚本顶部通过
source script_utils.sh或直接粘贴使用
脚本源码
#!/bin/bash
set -uo pipefail
list_color_init() {
export gl_hui=$'\033[38;5;59m'
export gl_hong=$'\033[38;5;9m'
export gl_lv=$'\033[38;5;10m'
export gl_huang=$'\033[38;5;11m'
export gl_lan=$'\033[38;5;32m'
export gl_bai=$'\033[38;5;15m'
export gl_zi=$'\033[38;5;13m'
export gl_bufan=$'\033[38;5;14m'
export reset=$'\033[0m'
}
list_color_init
log_info() { echo -e "${gl_lan}[信息]${gl_bai} $*${reset}"; }
log_ok() { echo -e "${gl_lv}[成功]${gl_bai} $*${reset}"; }
log_warn() { echo -e "${gl_huang}[警告]${gl_bai} $*${reset}"; }
log_error() { echo -e "${gl_hong}[错误]${gl_bai} $*${reset}" >&2; }
sleep_fractional() {
local seconds=$1
if sleep "$seconds" 2>/dev/null; then return 0; fi
if command -v perl >/dev/null 2>&1; then perl -e "select(undef, undef, undef, $seconds)"; return 0; fi
if command -v python3 >/dev/null 2>&1; then python3 -c "import time; time.sleep($seconds)"; return 0; fi
if command -v python >/dev/null 2>&1; then python -c "import time; time.sleep($seconds)"; return 0; fi
local int_seconds=$(awk -v s="$seconds" 'BEGIN{print int(s+0.999)}')
sleep "$int_seconds"
}
exit_script() {
echo ""
echo -ne "${gl_hong}感谢使用,再见!${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}\c"
sleep_fractional 0.5
echo -ne "${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}\c"
sleep_fractional 0.6
echo -e "${reset}"
clear
exit 0
}
handle_y_n() {
echo -e "${gl_hong}无效的选择,请输入 ${gl_bai}(${gl_lv}y${gl_bai}或${gl_hong}N${gl_bai})${gl_hong}。${reset}"
sleep 1
echo -e "${gl_huang}无效的选择,请输入 ${gl_bai}(${gl_lv}y${gl_bai}或${gl_hong}N${gl_bai})${gl_huang}。${reset}"
sleep 1
echo -e "${gl_lv}无效的选择,请输入 ${gl_bai}(${gl_lv}y${gl_bai}或${gl_hong}N${gl_bai})${gl_lv}。${reset}"
sleep_fractional 0.5
return 2
}
break_end() {
echo -e "${gl_lv}操作完成${gl_bai}${reset}"
echo -e -n "${gl_bai}按任意键继续${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai} ${reset}"
read -r -n 1 -s
echo ""
clear
}
remove_deployment_dir() {
local deploy_dir="$1"
if [[ -n "$deploy_dir" && -d "$deploy_dir" ]]; then
log_warn "正在删除部署目录: $deploy_dir"
rm -rf "$deploy_dir"
if [[ $? -eq 0 ]]; then
log_ok "部署目录已删除: $deploy_dir"
else
log_error "部署目录删除失败: $deploy_dir"
fi
elif [[ -n "$deploy_dir" ]]; then
log_warn "部署目录不存在,跳过删除: $deploy_dir"
fi
}
column_if_available() {
if command -v column &> /dev/null; then
column -t -s $'\t'
else
cat
fi
}
list_beautify_docker_ps() {
{
printf "%s%s\t%s\t%s\t%s\t%s\t%s\t%s%s\n" "$gl_hui" "容器ID" "镜像" "命令" "创建时间" "状态" "端口" "名称" "$reset"
printf "%s%s\t%s\t%s\t%s\t%s\t%s\t%s%s\n" "$gl_hui" "--------" "--------" "--------" "--------" "--------" "--------" "--------" "$reset"
docker ps -a --format "{{.ID}}\t{{.Image}}\t{{.Command}}\t{{.RunningFor}}\t{{.Status}}\t{{.Ports}}\t{{.Names}}" | \
awk -v cyan="$gl_bufan" -v green="$gl_lv" -v yellow="$gl_huang" -v blue="$gl_lan" -v white="$gl_bai" -v reset="$reset" '
BEGIN {FS="\t"; OFS="\t"}
{
id = substr($1, 1, 12)
image = $2
cmd = $3
created = $4
status = $5
ports = $6
name = $7
gsub(/ years ago/, "年前", created)
gsub(/ year ago/, "年前", created)
gsub(/ months ago/, "个月前", created)
gsub(/ month ago/, "个月前", created)
gsub(/ weeks ago/, "周前", created)
gsub(/ week ago/, "周前", created)
gsub(/ days ago/, "天前", created)
gsub(/ day ago/, "天前", created)
gsub(/ hours ago/, "小时前", created)
gsub(/ hour ago/, "小时前", created)
gsub(/ minutes ago/, "分钟前", created)
gsub(/ minute ago/, "分钟前", created)
gsub(/ seconds ago/, "秒前", created)
gsub(/ second ago/, "秒前", created)
gsub(/About /, "", created)
gsub(/ years ago/, "年前", status)
gsub(/ year ago/, "年前", status)
gsub(/ months ago/, "个月前", status)
gsub(/ month ago/, "个月前", status)
gsub(/ weeks ago/, "周前", status)
gsub(/ week ago/, "周前", status)
gsub(/ days ago/, "天前", status)
gsub(/ day ago/, "天前", status)
gsub(/ hours ago/, "小时前", status)
gsub(/ hour ago/, "小时前", status)
gsub(/ minutes ago/, "分钟前", status)
gsub(/ minute ago/, "分钟前", status)
gsub(/ seconds ago/, "秒前", status)
gsub(/ second ago/, "秒前", status)
gsub(/About /, "", status)
print cyan id reset, blue image reset, white cmd reset, blue created reset, yellow status reset, white ports reset, green name reset
}'
} | column_if_available
}
docker_clean_all() {
local deploy_dir="${1:-}"
clear
echo -e "${gl_huang}>>> Docker 容器/镜像 列表${gl_bai}"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
list_beautify_docker_ps
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
echo ""
echo -e "${gl_zi}>>> Docker 环境彻底清理${gl_bai}${reset}"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
echo -e "${gl_hong}⚠️ 警告: 此操作将彻底清理 Docker 环境!${reset}"
echo -e "${gl_huang} - 删除所有容器 (运行中/停止)${reset}"
echo -e "${gl_huang} - 删除所有镜像${reset}"
if [[ -n "$deploy_dir" ]]; then
echo -e "${gl_huang} - 删除部署目录: $deploy_dir${reset}"
fi
echo -e "${gl_bufan}————————————————————————————————————————————————${reset}"
read -r -e -p "$(echo -e "${gl_bai}确定执行彻底清理吗?(${gl_lv}y${gl_bai}/${gl_hong}N${gl_bai})(${gl_hong}0${gl_bai}退出): ${reset}")" choice
case "$choice" in
[Yy])
echo -ne "${gl_huang}正在停止并删除所有容器${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}\c"
sleep_fractional 0.5
echo -ne "${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}\c"
sleep_fractional 0.5
echo ""
local containers=$(docker ps -aq 2>/dev/null)
if [[ -n "$containers" ]]; then
docker stop $containers 2>/dev/null || true
docker rm -f $containers 2>/dev/null || true
log_ok "所有容器已删除"
else
log_info "没有容器需要删除"
fi
echo -ne "${gl_huang}正在删除所有镜像${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}\c"
sleep_fractional 0.5
echo -ne "${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}\c"
sleep_fractional 0.5
echo ""
local images=$(docker images -q 2>/dev/null)
if [[ -n "$images" ]]; then
docker rmi -f $images 2>/dev/null || true
log_ok "所有镜像已删除"
else
log_info "没有镜像需要删除"
fi
if [[ -n "$deploy_dir" ]]; then
remove_deployment_dir "$deploy_dir"
fi
log_ok "Docker 环境彻底清理完成!"
echo -e ""
echo -e "${gl_huang}>>> Docker 容器/镜像 列表${gl_bai}"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
list_beautify_docker_ps
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
break_end
;;
0)
exit_script
return 1
;;
*)
handle_y_n
;;
esac
}
docker_clean_all "${1:-}"
创建本地脚本
new_script="new_test.sh"
cat > "$new_script" << 'EOF'
#!/bin/bash
# 粘贴脚本源码
EOF
# 保留本地脚本,去掉 rm -f "$new_script"
chmod +x "$new_script" && ./"$new_script" && rm -f "$new_script"