2025-09-21 18:24:55 +08:00

170 lines
5.6 KiB
Bash
Raw 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
# 设置脚本执行选项:
# -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仓库认证