diff --git a/start.sh b/start.sh index f2bf008..d475f27 100755 --- a/start.sh +++ b/start.sh @@ -6,67 +6,150 @@ echo "===========================" echo "🚀 开始自动安装 Docker 和 Docker Compose" echo "===========================" -# 获取操作系统类型 -OS=$(hostnamectl | grep "Operating System" | awk '{print $3}') +# 获取操作系统类型和版本 +OS_FAMILY=$(hostnamectl | grep "Operating System" | awk '{print $3}') +OS_VERSION="" +if [[ "$OS_FAMILY" == "CentOS" ]]; then + OS_VERSION=$(grep -oP '(?<=^VERSION_ID=")[0-9.]+' /etc/os-release | cut -d'.' -f1) +elif [[ "$OS_FAMILY" == "Ubuntu" ]]; then + OS_VERSION=$(lsb_release -cs) +fi + +# 函数:检查并等待网络连接 +check_network() { + echo "🌐 检查网络连接..." + for i in {1..10}; do + if curl -sSf https://download.docker.com/ &> /dev/null; then + echo "✅ 网络连接正常。" + return 0 + else + echo "⚠️ 网络连接异常或无法访问 Docker 仓库,等待 10 秒后重试... ($i/10)" + sleep 10 + fi + done + echo "❌ 无法建立网络连接到 Docker 仓库,请检查您的网络配置。" + exit 1 +} + +# 预检网络连接 +check_network # Docker 安装 if command -v docker &> /dev/null; then echo "✅ Docker 已安装,跳过安装步骤" else - if [[ "$OS" == "Ubuntu" ]]; then + if [[ "$OS_FAMILY" == "Ubuntu" ]]; then echo "📦 安装依赖 (Ubuntu)..." sudo apt update -y sudo apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release echo "🔑 添加 Docker GPG 密钥 (Ubuntu)..." - curl -fsSL https://mirrors.nwafu.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add - + # 使用国内镜像作为备用,或直接从 Docker 官方获取 + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg || \ + curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "🌍 添加 Docker 源 (Ubuntu)..." - sudo add-apt-repository -y "deb [arch=amd64] https://mirrors.nwafu.edu.cn/docker-ce/linux/ubuntu/ $(lsb_release -cs) stable" + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ + $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + sudo apt-get update -y echo "🐳 安装 Docker (Ubuntu)..." - sudo apt-get install -y docker.io + sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + # 确保安装 docker-compose-plugin 而不是旧版 docker-compose - elif [[ "$OS" == "CentOS" ]]; then + elif [[ "$OS_FAMILY" == "CentOS" ]]; then echo "📦 安装依赖 (CentOS)..." sudo yum install -y yum-utils device-mapper-persistent-data lvm2 echo "🌍 添加 Docker 源 (CentOS)..." - sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo + # 尝试使用官方源,如果失败则提示用户检查网络或考虑配置国内镜像 + sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo || { + echo "❌ 无法添加 Docker 官方源。请检查您的网络连接或尝试手动配置国内镜像源。" + exit 1 + } + + # CentOS 8+ 可能会遇到 module 冲突,禁用默认的 container-tools 模块 + if [[ "$OS_VERSION" -ge "8" ]]; then + echo "⚙️ 禁用 CentOS 8+ 默认的 container-tools 模块以避免冲突..." + sudo yum module disable -y container-tools + sudo yum module enable -y container-tools:docker + fi echo "🐳 安装 Docker (CentOS)..." - sudo yum install -y docker-ce docker-ce-cli containerd.io + # 尝试安装 Docker CE 及其组件,包括 buildx 插件 + sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin || { + echo "❌ Docker 或其组件安装失败。请检查错误日志或尝试手动安装。" + echo "提示:如果遇到 'No more mirrors to try' 错误,可能是网络问题或防火墙阻止了访问。" + exit 1 + } else - echo "❌ 未知操作系统,无法安装 Docker。" + echo "❌ 未知操作系统 ($OS_FAMILY),无法安装 Docker。" exit 1 fi echo "✅ 启动并设置 Docker 开机自启..." sudo systemctl enable docker sudo systemctl start docker + # 将当前用户添加到 docker 组,以便无需 sudo 运行 Docker 命令 + if ! getent group docker | grep -qw "$USER"; then + echo "👥 将当前用户 ($USER) 添加到 docker 组..." + sudo usermod -aG docker "$USER" + echo "🔔 请注销并重新登录,以便更改生效。" + fi fi -# Docker Compose 安装 -if command -v docker-compose &> /dev/null; then - echo "✅ Docker Compose 已安装,跳过安装步骤" +# Docker Compose 安装(使用 docker-compose-plugin 替代独立安装) +# 新版 Docker 建议使用 docker-compose-plugin,它是 Docker CLI 的一部分 +if command -v docker-compose &> /dev/null && ! command -v docker-compose-plugin &> /dev/null; then + echo "⚠️ 检测到旧版 Docker Compose 独立安装,建议升级到 docker-compose-plugin。" + echo "⚙️ 尝试安装 docker-compose-plugin..." + if [[ "$OS_FAMILY" == "Ubuntu" ]]; then + sudo apt-get install -y docker-compose-plugin + elif [[ "$OS_FAMILY" == "CentOS" ]]; then + sudo yum install -y docker-compose-plugin + fi + # 移除旧版,如果旧版存在且已成功安装新版 + if command -v docker-compose-plugin &> /dev/null && [[ -f "/usr/local/bin/docker-compose" ]]; then + echo "🗑️ 移除旧版 Docker Compose 独立安装..." + sudo rm -f /usr/local/bin/docker-compose + fi +elif command -v docker-compose-plugin &> /dev/null; then + echo "✅ Docker Compose (插件版) 已安装,跳过安装步骤" else - echo "⚙️ 安装 Docker Compose..." - # 假设 docker-compose-linux-x86_64 文件与脚本在同一目录下 - sudo mv ./docker-compose-linux-x86_64 /usr/local/bin/docker-compose - # 设置权限 - sudo chmod +x /usr/local/bin/docker-compose + echo "⚙️ 安装 Docker Compose (插件版)..." + if [[ "$OS_FAMILY" == "Ubuntu" ]]; then + sudo apt-get install -y docker-compose-plugin + elif [[ "$OS_FAMILY" == "CentOS" ]]; then + sudo yum install -y docker-compose-plugin + else + echo "❌ 未知操作系统,无法安装 Docker Compose 插件版。" + exit 1 + fi fi echo "📌 Docker 运行状态:" sudo systemctl status docker --no-pager || true echo "📌 Docker Compose 版本:" -docker-compose -v +# 优先使用 docker compose 命令(新版),如果不行再尝试 docker-compose(旧版或别名) +if command -v docker &> /dev/null && docker compose version &> /dev/null; then + docker compose version +elif command -v docker-compose &> /dev/null; then + docker-compose -v +else + echo "❌ 无法检测 Docker Compose 版本。" +fi echo "🎉 Docker 和 Docker Compose 已就绪!" echo "🚀 启动EasyAI" -sudo docker-compose pull && sudo docker-compose up -d +# 对于新版 docker-compose-plugin,命令是 'docker compose' +if command -v docker &> /dev/null && docker compose version &> /dev/null; then + sudo docker compose pull && sudo docker compose up -d +else # 兼容旧版独立安装的 docker-compose + sudo docker-compose pull && sudo docker-compose up -d +fi echo "🎉EasyAI应用启动成功" \ No newline at end of file