ansible-devops/scripts/docker.sh

210 lines
6.3 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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