forked from yindun/ansible-devops
210 lines
6.3 KiB
Bash
210 lines
6.3 KiB
Bash
|
|
#!/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 "$@"
|