惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Vercel News
Vercel News
博客园 - 司徒正美
大猫的无限游戏
大猫的无限游戏
Last Week in AI
Last Week in AI
V
Visual Studio Blog
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
宝玉的分享
宝玉的分享
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
WordPress大学
WordPress大学
博客园 - 聂微东
人人都是产品经理
人人都是产品经理
罗磊的独立博客
The Cloudflare Blog
V
V2EX
月光博客
月光博客
有赞技术团队
有赞技术团队
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
GbyAI
GbyAI
博客园 - 【当耐特】
T
Tailwind CSS Blog

博客园 - cn2025

K8s -sentinel-dashboard【nacos版本】集 20260815 kubeSphere【ks-controller-manager-webhook-cert】证书 20260814 K8s -nacos集 20260813 K8s - 安装部署redis集群-哨兵sentinels集(支持从K8s外部访问)20260812 k8s-deployment发布测试(pv-pvc-deployment-service) 20260810 K8s - 安装部署Kafka、Zookeeper集群教程(支持从K8s外部访问)20260808 k8s-关机及启动脚本工具 【kubeSphere发布ruoyi-pro前端】工具脚本20260731 【k8s】 etcd服务端及客户端版本及快照【定时】备份 20260730 harbor【https启用】及k8节点部证书20260728 kube-flannel.yml k8s集群-安装helm 【kubeShpere】 官网 20260710 kubesphere-KDP HbuilderX 内置终端转为 gitBash 20260720 kubeSphere发布ruoyi-pro后端-用到脚本 kubeSphere发布ruoyi-web前端 20260711 kubeSphere发布ruoyi-pro后端 k8s集群-kubeShpere 20260710 安装Helm 20260710 k8s-portainer docker 镜像查询 k8集群一键重置 docker run OceanBase spring ai alibaba doc AI2.0 【多模态】 20260615 世界只有一个墨脱 AI2.0 【Mcp-client】 20260611 AI2.0 【Mcp-server】 20260611 GoLand 配Go SDK AI2.0 【redis向量-Rag】 问答顾问器QuestionAnswerAdvisor 20260608
工具脚本【kubeSphere发布ruoyi-pro前端】20260720
2026cn · 2026-07-20 · via 博客园 - cn2025

一、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;"]