#!/bin/bash
# 参数检查
if [ $# -ne 1 ]; then
echo "用法: $0 <镜像版本>"
exit 1
fi
# 配置参数
IMAGE_NAME="xx.hub.cn/namespace/image_name" # 镜像名称(按需修改)
CONTAINER_PATH="/data" # 容器内文件路径(按需修改)
HOST_PATH="/home/deploy" # 宿主机存储路径(按需修改)
APP_NAME="program_name"
PORTS=(8091 8092 8093 8094)
# 拉取镜像
VERSION=$1
FULL_IMAGE="${IMAGE_NAME}:${VERSION}"
echo "正在拉取镜像 ${FULL_IMAGE}..."
docker pull ${FULL_IMAGE} || {
echo "镜像拉取失败";
exit 1;
}
# 创建临时容器
CONTAINER_ID=$(docker create ${FULL_IMAGE}) || {
echo "容器创建失败";
exit 1;
}
# 创建宿主机目录
mkdir -p ${HOST_PATH}
# 执行文件拷贝
echo "正在拷贝文件..."
docker cp ${CONTAINER_ID}:${CONTAINER_PATH}/main.jar ${HOST_PATH}/${APP_NAME}.jar || {
echo "文件拷贝失败";
docker rm ${CONTAINER_ID} >/dev/null;
exit 1;
}
# 清理临时容器
docker rm ${CONTAINER_ID} >/dev/null
echo "文件已拷贝至: ${HOST_PATH}"
echo "开始重启服务, ports: ${PORTS[@]}"
for port in "${PORTS[@]}"
do
# 精确匹配进程(同时包含程序名和端口参数)
PID=$(ps -ef | grep "java.*-jar.*$APP_NAME.*--server.port=$port" | grep -v grep | awk '{print $2}')
# 停止已存在进程
if [ -n "$PID" ]; then
echo "Stopping $APP_NAME on port $port (PID:$PID)..."
kill -9 $PID
sleep 2 # 等待进程释放端口:ml-citation{ref="1" data="citationList"}
fi
# 启动新实例(带JVM基础参数):ml-citation{ref="5" data="citationList"}
nohup java -server -Dfile.encoding=utf-8 -XX:MaxDirectMemorySize=128m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Xms3006477107 -Xmx3006477107 -Xss2048k -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:+UseG1GC -Dlog4j2.formatMsgNoLookups=true -jar $HOST_PATH/$APP_NAME.jar --spring.profiles.active=test --server.port=$port --management.server.port=$port > $HOST_PATH/app_$port.log 2>&1 &
# 状态验证
sleep 1
if ps -p $! > /dev/null; then
echo "Successfully started $APP_NAME on port $port (PID:$!)"
else
echo "Failed to start instance on port $port"
tail -n 20 $HOST_PATH/app_$port.log
exit 1
fi
done
echo "服务已启动, 端口: ${PORTS[@]}"
版权声明:《 百度deepseek满血模型的杰作 》为Saber原创文章,转载请注明出处!
最后编辑:2025-2-28 14:02:25