/ docker.sh
docker.sh
1 #!/bin/bash 2 3 # ----------------------------------------------------------------------------- 4 # One-click Deployment Script 5 # 6 # Features: 7 # 1. Check and install Docker and Docker Compose 8 # 2. Download application from Git repository 9 # 3. Create independent release package directory 10 # 4. Start application using Docker Compose 11 # ----------------------------------------------------------------------------- 12 13 # Set color variables for output 14 GREEN='\033[0;32m' 15 YELLOW='\033[1;33m' 16 RED='\033[0;31m' 17 NC='\033[0m' # No Color 18 19 # 当任何命令失败时立即退出脚本 20 set -e 21 # 管道命令中任何一个失败,则整个管道视为失败 22 set -o pipefail 23 24 # --- 配置变量 --- 25 GIT_URL="https://github.com/Tencent/AI-Infra-Guard.git" 26 REPO_NAME="AI-Infra-Guard" 27 RELEASE_DIR="release-package" 28 # 可以修改为您需要的 Docker Compose 版本 29 COMPOSE_VERSION="v2.24.6" 30 31 IMAGE_AGENT="zhuquelab/aig-agent:latest" 32 IMAGE_SERVER="zhuquelab/aig-server:latest" 33 34 # --- 函数定义 --- 35 36 # 打印信息 37 info() { 38 echo -e "${YELLOW}[INFO] $1${NC}" 39 } 40 41 # 打印成功信息 42 success() { 43 echo -e "${GREEN}[SUCCESS] $1${NC}" 44 } 45 46 # 打印错误信息并退出 47 error_exit() { 48 echo -e "${RED}[ERROR] $1${NC}" >&2 49 exit 1 50 } 51 52 # 检查命令是否存在 53 command_exists() { 54 command -v "$1" &> /dev/null 55 } 56 57 # 检查并安装 Docker 58 install_docker() { 59 if command_exists docker; then 60 success "Docker 已安装。版本信息: $(docker --version)" 61 else 62 info "未检测到 Docker,正在尝试安装..." 63 if ! curl -fsSL https://get.docker.com | bash -s docker; then 64 error_exit "Docker 安装失败。请检查网络或手动安装。" 65 fi 66 67 info "正在启动并设置 Docker 开机自启..." 68 if ! systemctl enable --now docker; then 69 error_exit "无法启动或设置 Docker 开机自启。请检查 systemd 状态。" 70 fi 71 success "Docker 安装并启动成功!" 72 fi 73 } 74 75 # 检查并安装 Docker Compose(优先使用 docker compose v2,不可用时回退到 docker-compose) 76 COMPOSE_CMD="" 77 install_docker_compose() { 78 if docker compose version &>/dev/null; then 79 COMPOSE_CMD="docker compose" 80 success "Docker Compose (docker compose) 已可用。版本信息: $(docker compose version)" 81 return 82 fi 83 if command_exists docker-compose; then 84 COMPOSE_CMD="docker-compose" 85 success "Docker Compose 已安装。版本信息: $(docker-compose --version)" 86 else 87 info "未检测到 Docker Compose,正在尝试安装版本 ${COMPOSE_VERSION}..." 88 89 # 检查系统架构 90 DOCKER_COMPOSE_URL="https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" 91 92 info "正在从 ${DOCKER_COMPOSE_URL} 下载..." 93 if ! curl -L "${DOCKER_COMPOSE_URL}" -o /usr/local/bin/docker-compose; then 94 error_exit "Docker Compose 下载失败。请检查网络或 GitHub Release 页面。" 95 fi 96 97 if ! chmod +x /usr/local/bin/docker-compose; then 98 error_exit "为 Docker Compose 添加执行权限失败。" 99 fi 100 101 COMPOSE_CMD="docker-compose" 102 success "Docker Compose 安装成功!版本信息: $(docker-compose --version)" 103 fi 104 } 105 106 # 部署应用 107 deploy_application() { 108 info "开始部署应用..." 109 110 # 检查是否存在旧的目录,并询问用户是否删除 111 if [ -d "${REPO_NAME}" ] || [ -d "${RELEASE_DIR}" ]; then 112 info "检测到已存在的目录 (${REPO_NAME} 或 ${RELEASE_DIR})。" 113 read -p "是否要删除这些目录并重新部署? [y/N]: " -n 1 -r 114 echo 115 if [[ $REPLY =~ ^[Yy]$ ]]; then 116 info "正在删除旧目录..." 117 rm -rf "${REPO_NAME}" "${RELEASE_DIR}" 118 success "旧目录已删除。" 119 else 120 error_exit "用户取消操作。部署中止。" 121 fi 122 fi 123 124 # 1. 克隆仓库 125 info "正在从 ${GIT_URL} 克隆仓库..." 126 if ! git clone --depth 1 "${GIT_URL}"; then 127 error_exit "Git 克隆失败。请检查 Git URL 或网络连接。" 128 fi 129 success "仓库克隆成功。" 130 131 # 2. 创建发布目录并复制文件 132 info "正在创建发布目录: ${RELEASE_DIR}" 133 mkdir -p "${RELEASE_DIR}"/{db,logs,uploads} 134 135 info "正在复制必要文件到 ${RELEASE_DIR}..." 136 # 进入源仓库目录以简化复制路径 137 cd "${REPO_NAME}" 138 139 cp docker-compose.images.yml "../${RELEASE_DIR}/docker-compose.yml" 140 cp -r data "../${RELEASE_DIR}/data" 141 cp README.md "../${RELEASE_DIR}/README.md" 142 cp README_ZH.md "../${RELEASE_DIR}/README_ZH.md" 143 cp CHANGELOG.md "../${RELEASE_DIR}/CHANGELOG.md" 144 145 # 返回上级目录 146 cd .. 147 success "文件复制完成。" 148 149 # 3. 清理原始仓库 150 info "正在清理临时文件..." 151 rm -rf "${REPO_NAME}" 152 success "临时文件清理完毕。" 153 154 # 4. 检测并删除旧镜像 155 if docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "^$IMAGE_AGENT$"; then 156 info "检测到旧Agent镜像,正在删除..." 157 docker rmi "$IMAGE_AGENT" 158 fi 159 160 if docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "^$IMAGE_SERVER$"; then 161 info "检测到旧Server镜像,正在删除..." 162 docker rmi "$IMAGE_SERVER" 163 fi 164 165 # 5. 启动 Docker Compose 166 cd "${RELEASE_DIR}" 167 info "当前目录: $(pwd)" 168 info "正在使用 ${COMPOSE_CMD} 启动服务 (后台模式)..." 169 # 在拉取镜像前先检查 Docker 守护进程是否可用,避免用户已经安装 Docker 但服务未启动的情况 170 if ! docker info >/dev/null 2>&1; then 171 error_exit "无法连接到 Docker 守护进程。请确认 Docker 服务已启动(例如使用 'systemctl status docker' 或 'service docker start'),然后重新运行本脚本。" 172 fi 173 if ! $COMPOSE_CMD pull; then 174 error_exit "Compose 拉取镜像失败。请先查看上方 ${COMPOSE_CMD} 输出的详细错误信息。常见原因包括:无法访问镜像仓库(网络或代理问题)、镜像仓库被防火墙拦截、或仓库地址配置错误。" 175 fi 176 if ! $COMPOSE_CMD up -d; then 177 error_exit "Compose 启动失败。请使用 '${COMPOSE_CMD} logs' 查看错误日志。" 178 fi 179 180 success "应用部署并启动成功!" 181 } 182 183 # --- 主函数 --- 184 main() { 185 # 检查是否为 root 用户 186 if [ "$(id -u)" -ne 0 ]; then 187 error_exit "此脚本需要 root 权限运行。请使用 'sudo bash $0' 执行。" 188 fi 189 190 # 检查核心依赖 191 command_exists git || error_exit "请先安装 'git'。" 192 command_exists curl || error_exit "请先安装 'curl'。" 193 194 # 执行流程 195 install_docker 196 install_docker_compose 197 deploy_application 198 199 # 结束提示 200 echo 201 success "==========================================================" 202 success " 所有操作已成功完成!" 203 success "==========================================================" 204 info "应用正在后台运行中。" 205 info "您可以使用 'cd ${RELEASE_DIR}' 进入应用目录。" 206 info "查看服务状态: ${YELLOW}${COMPOSE_CMD} ps${NC}" 207 info "查看实时日志: ${YELLOW}${COMPOSE_CMD} logs -f${NC}" 208 info "停止并移除容器: ${YELLOW}${COMPOSE_CMD} down${NC}" 209 echo 210 } 211 212 # --- 脚本入口 --- 213 main