From 70795dd7bc9deca7cdc2e118e4161c11e28841b4 Mon Sep 17 00:00:00 2001 From: joy Date: Wed, 24 Sep 2025 09:32:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20scripts/docker.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/docker.sh | 209 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 scripts/docker.sh diff --git a/scripts/docker.sh b/scripts/docker.sh new file mode 100644 index 0000000..f61ab81 --- /dev/null +++ b/scripts/docker.sh @@ -0,0 +1,209 @@ +#!/bin/bash +set -e + +# 初始化变量 +OPERATION="" +VERSION="" +DOCKER_PACKAGES="docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin" +# 提取版本号(如从"5:28.4.0-1~ubuntu.24.04~noble"中提取"28.4.0") +EXTRACT_VERSION=$(echo "$VERSION" | awk -F'[:-]' '{print $2}') + +# 打印步骤信息(仅关键流程) +print_step() { + echo -e "\033[1;34m[*] $1\033[0m" +} + +# 打印成功信息(最终结果) +print_success() { + echo -e "\033[1;32m[+] $1\033[0m" +} + +# 打印错误信息(仅报错时显示) +print_error() { + echo -e "\033[1;31m[-] 错误:$1\033[0m" >&2 +} + +# 解析命令行参数 +parse_args() { + while [[ $# -gt 0 ]]; do + case "$1" in + --install) + OPERATION="install" + shift + ;; + --uninstall) + OPERATION="uninstall" + shift + ;; + --version) + if [[ -n "$2" && "$2" != --* ]]; then + VERSION="$2" + EXTRACT_VERSION=$(echo "$VERSION" | awk -F'[:-]' '{print $2}') # 提前提取版本号 + shift 2 + else + print_error "缺少版本号,请用 --version 指定(如 5:28.4.0-1~ubuntu.24.04~noble)" + exit 1 + fi + ;; + *) + print_error "未知参数:$1" + exit 1 + ;; + esac + done + + # 验证必要参数 + if [[ -z "$OPERATION" ]]; then + print_error "请指定操作:--install(安装) 或 --uninstall(卸载)" + exit 1 + fi + if [[ -z "$VERSION" ]]; then + print_error "请用 --version 指定Docker版本" + exit 1 + fi +} + +# 安装必要依赖(屏蔽冗余日志,仅捕错) +install_dependencies() { + print_step "正在安装依赖工具" + # apt-get 静默执行,日志重定向到/dev/null,仅保留错误输出 + if ! apt-get update -qq >/dev/null 2>&1; then + print_error "更新软件源失败" + exit 1 + fi + if ! apt-get install -qq -y ca-certificates curl gnupg lsb-release >/dev/null 2>&1; then + print_error "安装依赖(ca-certificates/curl等)失败" + exit 1 + fi + print_success "依赖工具安装完成" +} + +# 添加Docker GPG密钥(自动覆盖,屏蔽日志) +add_gpg_key() { + print_step "正在添加Docker GPG密钥" + mkdir -p /etc/apt/keyrings + # curl+gpg 静默执行,自动覆盖现有文件 + if ! curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg >/dev/null 2>&1; then + print_error "添加GPG密钥失败(网络或密钥地址异常)" + exit 1 + fi + print_success "GPG密钥添加完成" +} + +# 添加Docker源(屏蔽日志) +add_docker_repo() { + print_step "正在配置Docker软件源" + # 写入源配置,更新源时静默执行 + echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list >/dev/null 2>&1 + if ! apt-get update -qq >/dev/null 2>&1; then + print_error "更新Docker软件源失败" + exit 1 + fi + print_success "Docker软件源配置完成" +} + +# 安装指定版本Docker(核心:屏蔽安装日志,仅显结果/错误) +install_docker() { + print_step "正在安装Docker $EXTRACT_VERSION(版本号:$VERSION)" + + # 构建安装命令:仅docker-ce/cli指定版本,其他包默认最新(兼容依赖) + install_cmd="apt-get install -qq -y" + for pkg in $DOCKER_PACKAGES; do + if [[ $pkg == "docker-ce" || $pkg == "docker-ce-cli" ]]; then + install_cmd="$install_cmd $pkg=$VERSION" + else + install_cmd="$install_cmd $pkg" + fi + done + + # 静默安装:日志重定向,仅捕获错误 + if ! eval $install_cmd >/dev/null 2>&1; then + print_error "Docker安装失败(可能版本不兼容或网络问题)" + exit 1 + fi + + # 启动并设置开机自启(静默处理) + if ! systemctl is-active --quiet docker; then + if ! systemctl start docker >/dev/null 2>&1; then + print_error "Docker服务启动失败" + exit 1 + fi + fi + if ! systemctl is-enabled --quiet docker; then + systemctl enable docker >/dev/null 2>&1 + fi + + # 最终验证 + if ! docker --version >/dev/null 2>&1; then + print_error "Docker安装后验证失败(命令不可用)" + exit 1 + fi + print_success "Docker $EXTRACT_VERSION 安装成功!" +} + +# 卸载指定版本Docker(屏蔽日志) +uninstall_docker() { + print_step "正在卸载Docker $EXTRACT_VERSION(版本号:$VERSION)" + + # 停止服务(静默) + if systemctl is-active --quiet docker; then + if ! systemctl stop docker >/dev/null 2>&1; then + print_error "Docker服务停止失败" + exit 1 + fi + fi + + # 构建卸载命令:仅指定docker-ce/cli版本,其他包全卸载 + uninstall_cmd="apt-get purge -qq -y" + for pkg in $DOCKER_PACKAGES; do + if [[ $pkg == "docker-ce" || $pkg == "docker-ce-cli" ]]; then + uninstall_cmd="$uninstall_cmd $pkg=$VERSION" + else + uninstall_cmd="$uninstall_cmd $pkg" + fi + done + + # 静默卸载,清理残留 + if ! eval $uninstall_cmd >/dev/null 2>&1; then + print_error "Docker卸载失败(可能包依赖冲突)" + exit 1 + fi + # 清理数据目录(屏蔽日志) + rm -rf /var/lib/docker /var/lib/containerd >/dev/null 2>&1 + + print_success "Docker $EXTRACT_VERSION 卸载成功!" +} + +# 主函数(入口) +main() { + # 检查root权限 + if [[ $EUID -ne 0 ]]; then + print_error "请用root用户运行脚本(sudo bash docker.sh ...)" + exit 1 + fi + + parse_args "$@" + + # 根据操作分支执行 + case "$OPERATION" in + install) + install_dependencies + add_gpg_key + add_docker_repo + install_docker + ;; + uninstall) + uninstall_docker + ;; + *) + print_error "未知操作:$OPERATION" + exit 1 + ;; + esac + + # 正常退出(状态码0) + exit 0 +} + +# 启动脚本 +main "$@"