#!/bin/bash # 设置脚本执行选项: # -e: 遇到错误立即退出 # -u: 遇到未定义变量报错 # -a: 自动导出所有变量(set -a 表示自动导出,set +a 表示关闭自动导出) set -a # 检测操作系统类型并加载环境变量文件 # 判断是否为 RedHat 或 Rocky Linux 系统 if [ -f /etc/redhat-release ] || [ -f /etc/rocky-release ]; then # 在 RedHat 系系统上使用 source 命令加载 .env 环境变量文件 source ./.env # 判断是否为 Debian/Ubuntu 系统(基于LSB标准) elif [ -f /etc/lsb-release ]; then # 在 Debian 系系统上使用 . 命令加载 .env 环境变量文件 . ./.env else # 不支持的操作系统提示 echo "Unsupported OS" exit 1 # 退出脚本,返回错误码 fi # 关闭自动导出变量模式 set +a # 定义变量 schema="https://" # 协议方案,默认为HTTPS serverName=$2 # 第二个参数:服务名称(如 xiaomayi-admin) tag=$3 # 第三个参数:镜像标签(如 prod-31) # 函数:显示脚本使用说明和描述信息 desc() { clear # 清屏 echo "===========================================================" echo "Deploy Containter" # 脚本用途:部署容器 echo "===========================================================" echo "version 0.1" # 脚本版本号 echo "deploy: deploy containter" # 部署命令用法 echo "delete: delete containter" # 删除命令用法 echo "" echo "===========================================================" echo press any key to continue && read TEMP && echo ok.. # 等待用户按键继续 } # 函数:获取指定容器的镜像名称 list_image() { # 使用 docker inspect 命令获取容器的镜像名称 # --format="{{.Config.Image}}" 指定输出格式为镜像名称 image_id=`docker inspect --format="{{.Config.Image}}" ${serverName}` } # 函数:获取指定容器的进程ID(容器ID) list_process() { # 使用 docker inspect 命令获取容器的完整ID # --format="{{.Id}}" 指定输出格式为容器ID process_id=`docker inspect --format="{{.Id}}" ${serverName}` } # 函数:从Docker仓库拉取镜像 pull_image() { echo "----------------" echo "Pull Image" # 拉取镜像阶段开始 echo "----------------" # 构建完整的镜像名称 # 格式:仓库URL/命名空间/服务名称 imageName="${DOCKER_REGISTRY_URL}/${DOCKER_REGISTRYURL_NAMESPACE}/${serverName}" # 登录到Docker仓库(使用密码管道方式,避免密码明文出现在命令行历史中) echo "$DOCKER_PASSWORD" | docker login --username=${DOCKER_USERNAME} --password-stdin ${DOCKER_REGISTRY_URL} # 拉取指定标签的镜像 docker pull "${imageName}:${tag}" echo "" # 输出空行 } # 函数:运行镜像(部署容器) deploy_image() { echo "----------------" echo "Deploy Image" # 部署镜像阶段开始 echo "----------------" # 设置版本环境变量,供docker-compose使用 export VERSION=${tag} # 使用docker compose启动服务(后台模式) # -d: 后台运行容器 # ${serverName}: 只启动指定的服务 docker compose up -d ${serverName} echo "" # 输出空行 } # 函数:停止并删除容器和镜像 delete_image() { echo "----------------" echo "Delete Image" # 删除镜像阶段开始 echo "----------------" # 获取当前容器的镜像信息和进程信息 list_image list_process # 检查镜像是否存在 if [ "$image_id" != "" ] ; then # 检查容器进程是否存在 if [ "$process_id" != "" ] ; then # 停止正在运行的容器 echo "Stopping container: $process_id" docker stop $process_id # 删除已停止的容器 echo "Removing container: $process_id" docker rm $process_id # 强制删除镜像(即使有依赖也强制删除) echo "Removing image: $image_id" docker rmi --force $image_id else # 如果容器不存在,只删除镜像 echo "Removing image: $image_id" docker rmi --force $image_id fi else echo "No image found for: ${serverName}" fi echo "" # 输出空行 } # 主程序:根据传入的参数执行不同的操作 case $1 in "deploy") # 部署操作 echo "Starting deployment process for ${serverName}:${tag}" pull_image # 第一步:拉取镜像 delete_image # 第二步:删除旧容器和镜像(清理环境) deploy_image # 第三步:部署新容器 echo "Deployment completed for ${serverName}:${tag}" ;; "delete") # 删除操作 echo "Starting deletion process for ${serverName}" delete_image # 删除容器和镜像 echo "Deletion completed for ${serverName}" ;; *) # 默认情况:显示帮助信息 echo "Invalid command: $1" desc # 显示使用说明 ;; esac # 脚本结束 # 使用示例: # ./deploy_env.sh deploy xiaomayi-admin prod-31 # ./deploy_env.sh delete xiaomayi-admin # # 依赖文件: # .env 文件需要包含以下环境变量: # DOCKER_REGISTRY_URL=docker仓库地址 # DOCKER_REGISTRYURL_NAMESPACE=命名空间 # DOCKER_USERNAME=用户名 # DOCKER_PASSWORD=密码 # # 功能说明: # 1. 支持多操作系统环境检测 # 2. 自动加载环境变量配置 # 3. 提供完整的容器部署流程 # 4. 支持容器清理和删除 # 5. 安全的Docker仓库认证