Files
devopsscripts/backend/apprun.sh
2026-02-28 11:50:53 +08:00

332 lines
8.3 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.
#!/usr/bin/bash
# 项目名称
PROJECT_NAME=
# 项目镜像名称
IMAGE_NAME=
################### 可选配置 #####################
# 公司名称
COMPANY_NAME=mingjiang
# 网络名称
NETWORK_NAME=${COMPANY_NAME}_network
# 服务端口及容器透出端口,多个以,分割,服务端口与透出端口以:进行分割,格式为:服务端口:透出到服务器端口
# ***** 服务默认第一个端口为注册eureka端口 《《重要》》 *****
# ***** 必须至少存在一个映射端口 *****
# SERVER_PORTS=8800:8801,8811
# SERVER_PORTS=8080
# java虚拟机配置
JAVA_OPS=""
# 链路追踪路径
SKYWALKING_OPS=
# 项目目录路径
ROOT_PREFIX_DIR=/opt/$COMPANY_NAME
# 是否启用XXL-JOB启动检测默认不启用
ENABLE_XXLJOB=0
# 日志存放路径
LOG_PATH=$ROOT_PREFIX_DIR/logs/$PROJECT_NAME
# 使用说明
usage() {
echo "
===============================================================================================================
Usagesh 执行脚本.sh [update|start|stop|restart|remove|status|version|images]
update更新镜像 会查询当前是否有.tar.gz的镜像文件则将镜像加载到镜像列表文件列表则为镜像名称并删除镜像文件
start启动服务 根据最新镜像版本启动当前服务程序
stop停止服务 停止当前服务容器
restart重启 停止当前服务容器,并删除容器,并以服务最新镜像拉起服务容器
remove删除 删除当前服务容器,就算容器正在运行也会被强制删除
status服务状态 查询当前服务是否在运行中,如果在运行则打印出当前运行容器信息
version当前版本 查看当前容器使用的镜像版本
images服务镜像版本列表 查看当前服务的镜像版本列表
===============================================================================================================
"
exit 0
}
# 判断是否存在docker容器
has_docker() {
docker version > /etc/null
if [ $? != 0 ]
then
echo "docker is not install"
exit 1
fi
}
# 判断是否存在当前应用的镜像
has_image() {
c=$(docker images|grep $IMAGE_NAME|wc -l)
if [ $c = 0 ]
then
return 1
fi
return 0
}
# 判断是否存在网络连接
checkOrCreate_network() {
c=$(docker network list|grep "${NETWORK_NAME}"|wc -l)
if [ $c = 0 ]
then
docker network create $NETWORK_NAME >/dev/null
fi
return 0
}
# 查询清理镜像
clear_image() {
rows=$(docker images -f reference="$IMAGE_NAME"|wc -l)
if [ $rows -ge 1 ]
then
docker rmi -f $(docker images -f reference="$IMAGE_NAME" -q)
echo "服务 $PROJECT_NAME 容器删除成功"
else
return 0
fi
}
# 判断容器是否在运行
has_run() {
rows=$(docker ps -f name=$PROJECT_NAME\$|wc -l)
if [ $rows -eq 1 ]
then
return 1
else
return 0
fi
}
has_container() {
rows=$(docker ps -a -f name=$PROJECT_NAME\$|wc -l)
if [ $rows -eq 1 ]
then
return 1
else
return 0
fi
}
# 停止运行的jar服务
stop_jar_run() {
pid=$(ps -ef|grep $PROJECT_NAME-|grep -v grep|awk '{print $2}')
if [ ! -z "$pid" ]
then
kill $pid
fi
}
# 判断是否有当前服务未启动
has_stop_container() {
containerId=$(docker ps -a -f name=$PROJECT_NAME\$|grep Exited|awk '{print $1}')
if [ -z "$containerId" ]
then
return 1
else
return 0
fi
}
# 应用端口映射信息处理
port_map_processor() {
if [ -z "$SERVER_PORTS" ];then
echo ""
fi
portMap=""
IFS=',' read -ra pairs <<< "$SERVER_PORTS"
for pair in "${pairs[@]}"; do
if [[ $pair == *:* ]];then
# 按照冒号分割每个字符串
IFS=':' read -ra ports <<< "$pair"
portMap="${portMap} -p ${ports[1]}:${ports[0]}"
else
portMap="${portMap} -p ${pair}:${pair}"
fi
done
echo "$portMap"
}
# 加载镜像
load_image() {
clear_image
imageFiles=$(ls -1 -v $(pwd)|grep $IMAGE_NAME|grep tar.gz)
for imageFile in ${imageFiles}; do
version=$(echo $imageFile | sed "s/.tar.gz//g" | sed "s/$IMAGE_NAME//g" | sed "s/_//g")
if [ -n "$version" ]
then
echo "服务 $PROJECT_NAME 最新镜像为 $imageFile 版本为 $version"
tar xvf $imageFile
imageName=$(echo $imageFile | sed "s/.gz//g")
if [ -n "$imageName" ]
then
docker load < $imageName
echo "服务 $PROJECT_NAME 镜像 $imageFile 版本为 $version 导入成功"
rm -rf $imageName
fi
fi
done
}
# 启动容器
run() {
if [ ! -d "$LOG_PATH" ]
then
mkdir -p $LOG_PATH
fi
stop_jar_run
latestImageId=$(docker images|grep $IMAGE_NAME|sort -r|head -1|awk '{OFS=":"}{print $1}')
echo "服务 $PROJECT_NAME 最新镜像ID为 $latestImageId"
has_stop_container
if [ $? = 0 ]
then
containerId=$(docker ps -a -f name=$PROJECT_NAME\$|awk '{print $1}'|sed -n 2p)
nowImage=$(docker ps -a -f name=$PROJECT_NAME\$|awk '{print $2}'|sed -n 2p)
if [ $nowImage != $latestImageId ]
then
docker rm -f $containerId
else
docker restart $containerId
echo "服务 $PROJECT_NAME 启动成功"
exit 0
fi
fi
checkOrCreate_network
containerLogPath=/usr/local/$COMPANY_NAME/logs
PREFIX=${PROJECT_NAME##*-}
XXLJOB_LABEL = "--label \"traefik.enable=true\" \
--label \"traefik.http.routers.${PREFIX}-router.rule=PathPrefix(\`/${PREFIX}\`)\" \
--label \"traefik.http.routers.${PREFIX}-router.entrypoints=xxljob\" \
--label \"traefik.http.services.${PREFIX}-service.loadbalancer.server.port=9999\""
if [ -e "$(pwd)/.env" ];then
docker run -d -v /etc/localtime:/etc/localtime:ro --env-file .env $(port_map_processor) -v $LOG_PATH:$containerLogPath --network=$NETWORK_NAME $XXLJOB_LABEL --restart=always --name $PROJECT_NAME $latestImageId
echo "启动命令为: docker run -d -v /etc/localtime:/etc/localtime:ro --env-file .env $(port_map_processor) -v $LOG_PATH:$containerLogPath --network=$NETWORK_NAME $XXLJOB_LABEL --restart=always --name $PROJECT_NAME $latestImageId"
else
docker run -d -v /etc/localtime:/etc/localtime:ro -e JAVA_OPS="$JAVA_OPS" $(port_map_processor) -v $LOG_PATH:$containerLogPath --network=$NETWORK_NAME $XXLJOB_LABEL --restart=always --name $PROJECT_NAME $latestImageId
echo "启动命令为: docker run -d -v /etc/localtime:/etc/localtime:ro -e JAVA_OPS=\"$JAVA_OPS\" $(port_map_processor) -v $LOG_PATH:$containerLogPath --network=$NETWORK_NAME $XXLJOB_LABEL --restart=always --name $PROJECT_NAME $latestImageId"
fi
}
# 更新镜像
update() {
has_docker
load_image
if [ $? = 0 ]
then
echo "服务 $PROJECT_NAME 更新镜像成功"
fi
}
# 启动镜像容器
start() {
has_docker
has_image
if [ $? != 0 ]
then
load_image
has_image
if [ $? != 0 ]
then
echo "服务 $PROJECT_NAME 镜像不存在,启动失败"
exit 1
fi
fi
has_run
if [ $? != 0 ]
then
run
else
echo "服务 $PROJECT_NAME 容器已在运行中"
fi
}
# 停止镜像容器
stop() {
has_docker
has_run
if [ $? = 0 ]
then
docker stop $(docker ps -f name=$PROJECT_NAME\$|awk '{print $1}'|sed -n 2p)
echo "服务 $PROJECT_NAME 容器停止成功"
fi
}
# 重启容器
restart() {
has_docker
has_run
if [ $? = 0 ]
then
docker rm -f $(docker ps -a -f name=$PROJECT_NAME\$|awk '{print $1}'|sed -n 2p)
fi
load_image
run
}
# 删除容器
remove() {
has_docker
has_container
if [ $? = 0 ]
then
docker rm -f $(docker ps -a -f name=$PROJECT_NAME\$|awk '{print $1}'|sed -n 2p)
echo "服务 $PROJECT_NAME 容器删除成功"
fi
}
# 加载当前版本执行状态
status() {
has_docker
has_run
if [ $? = 0 ]
then
docker ps -f name=$PROJECT_NAME\$
else
echo "$PROJECT_NAME 未运行"
fi
}
# 获取当前服务所使用的镜像版本
version() {
has_docker
has_run
if [ $? = 0 ]
then
echo "当前使用版本为:$(docker ps -f name=$PROJECT_NAME\$ --format {{.Image}})"
fi
}
# 获取当前服务所存在的镜像版本
images() {
has_docker
echo "当前使用镜像为:$(docker images|grep $IMAGE_NAME|awk '{OFS=":"}{print $1}')"
}
case "$1" in
"update")
update
;;
"start")
start
;;
"stop")
stop
;;
"restart")
restart
;;
"remove")
remove
;;
"status")
status
;;
"version")
version
;;
"images")
images
;;
*)
usage
;;
esac