Dict.CN 在线词典, 英语学习, 在线翻译 ------------- MyGitee My腾云code My51cto

Happy_EveryDay

可以平凡 不可以平庸 无爱则无忧,无欲则无求,无怒而无敌,无怨才是佛。所有烦恼,都是放不下的执著 开源技群 328035181 MyGitee

博客园 首页 管理

 

 

 

一、WEB项目打包【npm run build:prod】并上传到工具宿主机

     宿主机【192.168.91.164: /home/web/yudao-web版本号     root/root】

      注版本号202607201317

1、hbuilderx-bash  免登录

###Bash 执行生成密钥

ssh-keygen -t rsa

####一路回车,无需设置密码

image

 ####公钥到服务器:

ssh-copy-id root@192.168.91.164

输入一次服务器 root 密码后,后续登录不再需要密码

 

 

2、web项目打包【npm run build:prod】并上传到工具宿主机的脚本

   build_upload.sh

 

 

 

 

 

 

 

#!/bin/bash
# 接收第一个入参:格式 YYYYMMDDHHMM
TIME_TAG="$1"
# 未传参则自动生成 当前年月日时分
if [ -z "${TIME_TAG}" ]; then
TIME_TAG=$(date +%Y%m%d%H%M)
fi
# 拼接远端完整目录
REMOTE_BASE="/home/web"
REMOTE_DIR="${REMOTE_BASE}/yudao-web${TIME_TAG}"

 

echo "==================== 发布信息 ===================="
echo "打包产物:dist-prod"
echo "远端目标目录:${REMOTE_DIR}"
echo "=================================================="

 

echo "===== 1. 执行生产打包 npm run build:prod ====="
npm run build:prod
if [ $? -ne 0 ]; then
echo "❌ 打包失败,终止上传流程"
exit 1
fi

 

echo "===== 2. 服务器自动创建目录(不存在则新建) ====="
ssh root@192.168.91.164 "mkdir -p ${REMOTE_DIR}"

 

echo "===== 3. 清空目标目录旧文件 ====="
ssh root@ "rm -rf ${REMOTE_DIR}/*"

 

echo "===== 4. 上传本地 dist-prod 全部资源 ====="
scp -r dist-prod/* root@192.168.91.164:${REMOTE_DIR}/

 

echo "✅ 打包上传完成,资源路径:${REMOTE_DIR}"

 

 

 

 

 

 

赋予脚本执行权限并运行:

chmod +x build_upload.sh

./build_upload.sh

image

 

 

 

image

 

 

 

 

 

 

 

 

 

二 脚本执行

 

image

 

1、生成镜像

./1web-build.sh   202607201317

 

image

 

 

 

2、镜像导出tar

./2web-save.sh   202607201317

image

 

 

3、tar推送到k8s节点的镜像

./3web-pull-k8s.sh   202607201317

 

image

 

k8s-master查看镜像

image

 

 

 

三、kubeSphere 的yaml版本升级

image

 

image

 

 旧版:192.168.91.164/rouyi-biz/yudao-web:20260908

新版:192.168.91.164/rouyi-biz/yudao-server:202607201317

 

   192.168.91.164/rouyi-biz/yudao-web:202607201317

 

 

 

 

 

 

 

 

6、参考脚本

1web-build.sh

#!/bin/bash
# 判断是否传入版本参数
if [ $# -ne 1 ]; then
echo "使用方式:./web-build.sh 版本号"
echo "示例:./web-build.sh 202607201317"
exit 1
fi

# 接收第一个入参作为版本
VERSION=$1

# 构建镜像命令
docker build \
--build-arg VERSION=${VERSION} \
-t 192.168.91.164/rouyi-biz/yudao-web:${VERSION} \
.

# 可选:构建完成自动推送镜像
# docker push 192.168.91.164/rouyi-biz/yudao-web:${VERSION}

 

 

 

 

 

 

 

2web-save.sh

#!/bin/bash
# 参数校验,必须传入1个版本号
if [ $# -ne 1 ]; then
echo "用法:$0 版本号"
echo "示例:$0 202607201317"
exit 1
fi

VERSION=$1
IMAGE_NAME="192.168.91.164/rouyi-biz/yudao-web:${VERSION}"
TAR_FILE="yudao-web${VERSION}.tar"

echo "开始导出镜像:${IMAGE_NAME}"
docker save -o ${TAR_FILE} ${IMAGE_NAME}
echo "镜像导出完成,文件:${TAR_FILE}"

 

 

 

 

 

 

3web-pull-k8s.sh

#!/bin/bash
# 批量分发web镜像tar并远端导入docker
# 使用方式 ./3web-pull-k8s.sh 版本号

# 入参校验
if [ $# -ne 1 ]; then
echo "使用方式:$0 版本号"
echo "示例:$0 202607201317"
echo "功能:将本地yudao-web{版本}.tar分发至166-master/167-node/168-node三台机器并自动导入镜像"
exit 1
fi

# 变量配置
TAG="$1"
TAR_FILE="yudao-web${TAG}.tar"
LOCAL_TAR="./${TAR_FILE}"
REMOTE_PATH="/root/${TAR_FILE}"
SSH_PASSWORD="root"
# 目标机器列表
NODE_LIST=(
"192.168.91.166"
"192.168.91.167"
"192.168.91.168"
)

# 校验本地tar文件是否存在
if [ ! -f "${LOCAL_TAR}" ]; then
echo "❌ 本地文件 ${LOCAL_TAR} 不存在,请先执行web-save.sh导出镜像!"
exit 2
fi

echo "====================================="
echo "待分发文件:${LOCAL_TAR}"
echo "目标节点:${NODE_LIST[*]}"
echo "远端账号密码:root / root"
echo "====================================="

# 循环遍历每台机器执行上传+导入
for node in "${NODE_LIST[@]}"; do
echo -e "\n==================== 开始处理节点 ${node} ===================="

# 1. scp上传tar包
echo "[1/3] 上传文件至 ${node}:/root/"
sshpass -p ${SSH_PASSWORD} scp "${LOCAL_TAR}" root@${node}:/root/
if [ $? -ne 0 ]; then
echo "❌ ${node} 文件上传失败,跳过当前节点"
continue
fi
echo "✅ ${node} 文件上传完成"

# 2. 远端导入docker镜像,导入后自动删除远端tar包释放磁盘
echo "[2/3] 在${node}执行docker load导入镜像"
sshpass -p ${SSH_PASSWORD} ssh root@${node} "docker load -i ${REMOTE_PATH} && rm -f ${REMOTE_PATH}"
if [ $? -ne 0 ]; then
echo "❌ ${node} 镜像导入失败"
continue
fi
echo "✅ ${node} 镜像导入成功,已清理远端tar包"

# 3. 查看当前节点yudao-web镜像列表做校验
echo "[3/3] 校验${node}已导入镜像:"
sshpass -p ${SSH_PASSWORD} ssh root@${node} "docker images | grep yudao-web"
done

echo -e "\n==================== 全部节点执行完毕 ===================="

 

 

 

 

 

 

 

 

 

 

Dockerfile

 

# 1. 全局定义构建参数VERSION,构建时传入,默认兜底dist兼容旧流程
ARG VERSION=""
# 基础Nginx镜像
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/u-sb/nginx:latest

# FROM内部重新声明ARG,镜像层内才能使用变量
ARG VERSION

# 只清理默认页面,不删除sites配置文件
RUN rm -rf /var/www/html/*

# 复制自定义配置到conf.d,Nginx会自动加载该目录下所有.conf
COPY nginx.conf /etc/nginx/conf.d/default.conf

# 你想要新增的一行(本地必须有site-default.conf文件,否则build报错)
COPY nginx.conf /etc/nginx/sites-enabled/default


# 复制前端dist静态资源
#COPY dist /var/www/html

# 拼接目录 yudao-web${VERSION},完全对应你要的 yudao-web版本号
COPY yudao-web${VERSION} /var/www/html


# 前台运行Nginx,防止容器退出重启
CMD ["nginx", "-g", "daemon off;"]

posted on 2026-07-20 13:31  2026cn  阅读(7)  评论(0)    收藏  举报