167 lines
5.5 KiB
Bash
167 lines
5.5 KiB
Bash
#!/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仓库认证 |