随机
Enter 搜索 ↑↓ 切换 Esc 清空

docker_clean_all

脚本

彻底清理 Docker 容器/镜像/目录

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 清理容器和镜像后,额外删除指定部署目录

注意事项

脚本源码

#!/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"

相关命令