Files
devopsscripts/front/apprun.sh
2026-01-14 19:18:03 +08:00

283 lines
6.1 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
# 使用说明
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 ls|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
}
# 加载镜像
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")
echo "服务 $PROJECT_NAME 最新镜像为 $imageFile 版本为 $version"
tar xvf $imageFile
imageName=$(echo $imageFile | sed "s/.gz//g")
docker load < $imageName
echo "服务 $PROJECT_NAME 镜像 $imageFile 版本为 $version 导入成功"
rm -rf $imageName
done
}
# 启动容器
run() {
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 "服务 $projectName 启动成功"
exit 0
fi
fi
docker run -d -v /etc/localtime:/etc/localtime:ro --network=$NETWORK_NAME --restart=always --name $PROJECT_NAME $latestImageId
echo "启动命令为: docker run -d -v /etc/localtime:/etc/localtime:ro --network=$NETWORK_NAME --restart=always --name $PROJECT_NAME $latestImageId"
}
# 更新镜像
update() {
has_docker
load_image
if [ $? = 0 ]
then
echo "服务 $PROJECT_NAME 更新镜像成功"
fi
}
# 启动镜像容器
start() {
has_docker
checkOrCreate_network
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_network
if [ $? != 0 ]
then
create_network
fi
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_run
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