【修改】dubbo配置;【新增】打包发布gbs相关。
parent
63389a7d42
commit
df9de45730
|
|
@ -0,0 +1,187 @@
|
||||||
|
GBS 部署配置分析报告
|
||||||
|
safety-eval-service (安全评价业务服务)
|
||||||
|
2026-06-26
|
||||||
|
1 项目概览
|
||||||
|
属性
|
||||||
|
值
|
||||||
|
项目名称
|
||||||
|
safety-eval-service
|
||||||
|
中文名称
|
||||||
|
重庆安全评价
|
||||||
|
应用名称 (application.name)
|
||||||
|
jjb-saas-cq-anquan
|
||||||
|
网关前缀 (application.gateway)
|
||||||
|
cqanquan
|
||||||
|
Spring 应用名
|
||||||
|
safety-eval-service
|
||||||
|
服务端口
|
||||||
|
8095
|
||||||
|
上下文路径
|
||||||
|
/safety-eval
|
||||||
|
Java 版本
|
||||||
|
1.8 (JDK 1.8.0_202)
|
||||||
|
Spring Boot 版本
|
||||||
|
2.7.18
|
||||||
|
架构
|
||||||
|
DDD 分层(6 模块)
|
||||||
|
数据库
|
||||||
|
jjb_saas_safety_eval
|
||||||
|
2 部署环境
|
||||||
|
项目
|
||||||
|
信息
|
||||||
|
镜像地址
|
||||||
|
jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||||
|
K8s 命名空间
|
||||||
|
jjb-dragon
|
||||||
|
Master 节点
|
||||||
|
192.168.20.100
|
||||||
|
ACR 仓库
|
||||||
|
jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com
|
||||||
|
镜像拉取密钥
|
||||||
|
image-pull-secret
|
||||||
|
Nacos 命名空间
|
||||||
|
jjb-dragon
|
||||||
|
已有 K8s 服务数
|
||||||
|
27 个(均为 ClusterIP 端口 80)
|
||||||
|
3 可确定填写的字段
|
||||||
|
以下字段均可通过项目配置文件和现有环境分析确定填写值。
|
||||||
|
3.1 路由信息(后端路由)
|
||||||
|
字段
|
||||||
|
填写值
|
||||||
|
依据
|
||||||
|
路由名称
|
||||||
|
重庆安全评价-后端
|
||||||
|
application.cn-name + 现有路由命名惯例
|
||||||
|
系统编码
|
||||||
|
jjb-saas-cq-anquan
|
||||||
|
application.name 属性
|
||||||
|
Prefix (StripPrefix)
|
||||||
|
0
|
||||||
|
项目配置 strip-prefix: 0,与现有全部后端路由一致
|
||||||
|
路径 (Path)
|
||||||
|
/cqanquan/**
|
||||||
|
application.gateway = cqanquan,格式 /${gateway}/**
|
||||||
|
标识 (Uri)
|
||||||
|
http://jjb-saas-cq-anquan
|
||||||
|
现有路由均为 http://<K8s服务名> 格式
|
||||||
|
3.2 其他配置
|
||||||
|
字段
|
||||||
|
填写值
|
||||||
|
说明
|
||||||
|
数据库名称
|
||||||
|
jjb_saas_safety_eval
|
||||||
|
表单已预填,MySQL 中确认存在
|
||||||
|
镜像密钥
|
||||||
|
image-pull-secret
|
||||||
|
表单已预填,K8s 中确认存在
|
||||||
|
应用类型
|
||||||
|
后端部署
|
||||||
|
已选中,正确
|
||||||
|
3.3 部署参数
|
||||||
|
字段
|
||||||
|
填写值
|
||||||
|
说明
|
||||||
|
JDK 版本
|
||||||
|
jdk8
|
||||||
|
已选中,与项目 Java 1.8 匹配
|
||||||
|
启动参数
|
||||||
|
保持现有内容
|
||||||
|
k8s-nacos:8848 是 GBS 平台内部 Nacos 地址
|
||||||
|
CPU
|
||||||
|
500 M
|
||||||
|
合理,与现有服务一致
|
||||||
|
副本数
|
||||||
|
1
|
||||||
|
合理,开发测试阶段
|
||||||
|
3.4 服务配置
|
||||||
|
字段
|
||||||
|
填写值
|
||||||
|
依据
|
||||||
|
服务名称
|
||||||
|
jjb-saas-cq-anquan
|
||||||
|
与 Uri 中服务名一致,遵循现有 K8s 命名惯例
|
||||||
|
开放端口
|
||||||
|
80
|
||||||
|
现有 27 个 K8s Service 全部是 ClusterIP 80 端口
|
||||||
|
4 需要 GBS 平台确认的字段
|
||||||
|
以下字段无法仅通过项目配置和环境分析确定,需要 GBS 平台侧提供信息。
|
||||||
|
4.1 心跳监控地址
|
||||||
|
项目的 Actuator 健康端点为 /cqanquan/actuator/health,但 GBS 平台要求的填写格式不确定:
|
||||||
|
可能需要完整 URL:http://jjb-saas-cq-anquan/cqanquan/actuator/health
|
||||||
|
也可能只需路径部分:/cqanquan/actuator/health
|
||||||
|
需确认 GBS 平台对心跳地址的格式规范
|
||||||
|
4.2 移动端应用(复选框)
|
||||||
|
项目配置中存在前端路由(路径 /cqanquan/container/**,指向 http://jjb-saas-base),说明可能有前端容器页面。是否需要在此次部署中一并配置,取决于业务需求。
|
||||||
|
若需要勾选,前端路由信息如下:
|
||||||
|
字段
|
||||||
|
填写值
|
||||||
|
路由名称
|
||||||
|
重庆安全评价-前端
|
||||||
|
系统编码
|
||||||
|
jjb-saas-cq-anquan-container
|
||||||
|
Prefix (StripPrefix)
|
||||||
|
0
|
||||||
|
路径 (Path)
|
||||||
|
/cqanquan/container/**
|
||||||
|
标识 (Uri)
|
||||||
|
http://jjb-saas-base
|
||||||
|
4.3 内存资源
|
||||||
|
表单当前填写的 128M 对 Spring Boot + Dubbo + Nacos 客户端组合偏小。建议至少 256M,但具体配额需确认 GBS 平台的资源限制策略。
|
||||||
|
4.4 开放端口:80 还是 8095
|
||||||
|
容器内 Spring Boot 实际监听端口为 8095,但现有所有 K8s Service 的端口都映射为 80。K8s Service 会做端口转发(80 --> 8095)。如果 GBS 平台要求填容器内端口,则填 8095;如果填 Service 端口,则填 80。根据现有环境惯例,填 80 大概率是正确的。
|
||||||
|
5 现有网关路由规律参考
|
||||||
|
以下是从 MySQL 数据库 jjb-saas-gateway 的 route 表中提取的现有后端服务路由规律:
|
||||||
|
字段
|
||||||
|
规律
|
||||||
|
示例
|
||||||
|
systemCode
|
||||||
|
与服务名一致
|
||||||
|
jjb-saas-auth
|
||||||
|
name
|
||||||
|
中文描述
|
||||||
|
权限管理
|
||||||
|
uri
|
||||||
|
http://<K8s服务名>
|
||||||
|
http://jjb-saas-auth
|
||||||
|
path
|
||||||
|
/<路径前缀>/**
|
||||||
|
/auth/**
|
||||||
|
stripPrefix
|
||||||
|
0(绝大多数后端服务)
|
||||||
|
0
|
||||||
|
filterAuthorizeName
|
||||||
|
token(需认证)
|
||||||
|
token
|
||||||
|
route_order
|
||||||
|
0(默认)
|
||||||
|
0
|
||||||
|
6 项目关键配置文件
|
||||||
|
文件路径
|
||||||
|
关键配置
|
||||||
|
application.yml
|
||||||
|
application.name=jjb-saas-cq-anquan, server.port=8095, context-path=/safety-eval
|
||||||
|
application-prod.yml
|
||||||
|
Nacos=prod-nacos:8848, MySQL=prod-mysql:3306
|
||||||
|
nacos/jjb-saas-demo.yml
|
||||||
|
网关路由规则(path、uri、strip-prefix)
|
||||||
|
nacos/config-actuator.yml
|
||||||
|
健康端点 /cqanquan/actuator/health
|
||||||
|
nacos/config-port.yml
|
||||||
|
共享端口配置(port=80)
|
||||||
|
sdk-prod2.yml
|
||||||
|
SDK 路由注册配置
|
||||||
|
7 镜像信息
|
||||||
|
属性
|
||||||
|
值
|
||||||
|
镜像地址
|
||||||
|
jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||||
|
镜像大小
|
||||||
|
792 MB
|
||||||
|
Digest
|
||||||
|
sha256:44ee933704c3667ad538513c3aa1729ba3493f20e924a5a8b58759f1ec1ba65b
|
||||||
|
基础镜像
|
||||||
|
centos:7
|
||||||
|
JDK
|
||||||
|
Oracle JDK 1.8.0_202
|
||||||
|
容器内 JAR 路径
|
||||||
|
/opt/app.jar
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
# ============================================================
|
||||||
|
# GBS Java Application Dockerfile Template
|
||||||
|
# Based on: CentOS 7 + Oracle JDK 1.8.0_202
|
||||||
|
# Usage: docker build -t <image-name>:<tag> -f Dockerfile .
|
||||||
|
# ============================================================
|
||||||
|
# Build context structure:
|
||||||
|
# .
|
||||||
|
# ├── Dockerfile
|
||||||
|
# ├── jdk1.8.0_202/ (JDK directory, copied from /opt/jdk1.8.0_202)
|
||||||
|
# └── target/
|
||||||
|
# └── *.jar (application JAR file)
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
FROM centos:7
|
||||||
|
|
||||||
|
# Set timezone to Asia/Shanghai
|
||||||
|
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
|
||||||
|
|
||||||
|
# Copy JDK
|
||||||
|
COPY jdk1.8.0_202/ /opt/jdk1.8.0_202/
|
||||||
|
|
||||||
|
# Set Java environment variables
|
||||||
|
ENV JAVA_HOME=/opt/jdk1.8.0_202
|
||||||
|
ENV PATH=$PATH:$JAVA_HOME/bin
|
||||||
|
ENV LANG=C.UTF-8
|
||||||
|
|
||||||
|
# Create log directory
|
||||||
|
RUN mkdir -p /opt/logs
|
||||||
|
|
||||||
|
# Copy the built JAR file
|
||||||
|
COPY target/*.jar /opt/app.jar
|
||||||
|
|
||||||
|
# Default entrypoint
|
||||||
|
# Runtime parameters can be overridden via K8s deployment or docker run -e
|
||||||
|
ENTRYPOINT ["/opt/jdk1.8.0_202/bin/java", \
|
||||||
|
"-Dnacos.namespace=jjb-dragon", \
|
||||||
|
"-Dnacos.url=prod-nacos:8848", \
|
||||||
|
"-Dspring.profiles.active=prod", \
|
||||||
|
"-Dmysql.password=Mysql@zcloud33080", \
|
||||||
|
"-Dmysql.host=192.168.20.100", \
|
||||||
|
"-Dmysql.port=33080", \
|
||||||
|
"-Dmysql.username=root", \
|
||||||
|
"-jar", "/opt/app.jar"]
|
||||||
|
|
@ -0,0 +1,306 @@
|
||||||
|
## GBS Java 应用 Docker 镜像打包操作流程
|
||||||
|
|
||||||
|
### 目录结构
|
||||||
|
|
||||||
|
```
|
||||||
|
build-tools/
|
||||||
|
├── README.md ← 本文档
|
||||||
|
├── Dockerfile ← Dockerfile 模板(CentOS 7 + JDK 1.8.0_202)
|
||||||
|
├── build.sh ← Shell 构建脚本(在 master 节点上执行)
|
||||||
|
├── build_push.py ← Python 构建脚本(在本地 Windows 上执行,自动上传+构建+推送)
|
||||||
|
└── install_env.sh ← 构建环境一键安装脚本(在 master 节点上执行)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 环境信息
|
||||||
|
|
||||||
|
| 项目 | 信息 |
|
||||||
|
|------|------|
|
||||||
|
| Master 节点 | 192.168.20.100 (root / Zcloud@zcloud100) |
|
||||||
|
| OS | CentOS 7 (已 EOL,yum 源已切换阿里云 vault) |
|
||||||
|
| JDK | Oracle JDK 1.8.0_202,路径 `/opt/jdk1.8.0_202` |
|
||||||
|
| Maven | Apache Maven 3.8.8,路径 `/opt/maven`,阿里云镜像 |
|
||||||
|
| Docker | 26.1.4,cgroupdriver=systemd,storage=overlay2 |
|
||||||
|
| ACR 仓库 | `jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com` |
|
||||||
|
| ACR 命名空间 | `ali_img_ns` |
|
||||||
|
| K8s 命名空间 | `jjb-dragon` |
|
||||||
|
|
||||||
|
### 镜像命名规则
|
||||||
|
|
||||||
|
完整镜像地址格式:
|
||||||
|
|
||||||
|
```
|
||||||
|
{ACR仓库}/{命名空间}/prod-aly-{环境前缀}-dragon-{应用名}:{环境前缀}-{日期}-{序号}
|
||||||
|
```
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```
|
||||||
|
jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||||
|
```
|
||||||
|
|
||||||
|
各部分说明:
|
||||||
|
|
||||||
|
- `prod-aly` — 固定前缀(生产环境-阿里云)
|
||||||
|
- `ota` — 环境前缀,对应不同业务模块
|
||||||
|
- `dragon` — 项目代号
|
||||||
|
- `jjb-saas-safety-eval` — 应用名称
|
||||||
|
- `ota-20260626-1` — 标签:环境前缀-年月日-序号(同一天多次构建递增序号)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 方式一:本地一键构建(推荐)
|
||||||
|
|
||||||
|
在本地 Windows 机器上执行 `build_push.py`,自动完成 JAR 上传 → Docker 构建 → ACR 推送。
|
||||||
|
|
||||||
|
**前置条件:** 本地已安装 Python 和 paramiko(`pip install paramiko`)
|
||||||
|
|
||||||
|
**执行命令:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python build_push.py <JAR文件路径> <应用名> <环境前缀> [序号]
|
||||||
|
```
|
||||||
|
|
||||||
|
**示例:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python build_push.py E:\projects\safety-eval-service\safety-eval-start\target\safety-eval-start-1.0-SNAPSHOT.jar jjb-saas-safety-eval ota 1
|
||||||
|
```
|
||||||
|
|
||||||
|
**输出:**
|
||||||
|
|
||||||
|
```
|
||||||
|
Image Address:
|
||||||
|
jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 方式二:在 Master 节点上构建
|
||||||
|
|
||||||
|
SSH 登录 master 节点后,使用 `build.sh` 脚本构建。
|
||||||
|
|
||||||
|
**Step 1 — 上传 JAR 到 master 节点**
|
||||||
|
|
||||||
|
在本地用 scp 或其他方式上传 JAR:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
scp safety-eval-start-1.0-SNAPSHOT.jar root@192.168.20.100:/tmp/
|
||||||
|
```
|
||||||
|
|
||||||
|
**Step 2 — SSH 登录 master**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh root@192.168.20.100
|
||||||
|
# 密码: Zcloud@zcloud100
|
||||||
|
```
|
||||||
|
|
||||||
|
**Step 3 — 执行构建脚本**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
source /etc/profile.d/java.sh
|
||||||
|
source /etc/profile.d/maven.sh
|
||||||
|
/opt/docker-templates/build.sh jjb-saas-safety-eval ota /tmp/safety-eval-start-1.0-SNAPSHOT.jar 1
|
||||||
|
```
|
||||||
|
|
||||||
|
脚本会自动完成:准备构建上下文 → 复制 JDK → Docker build → Docker login ACR → Docker push。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 方式三:手动分步操作
|
||||||
|
|
||||||
|
如果需要手动控制每一步:
|
||||||
|
|
||||||
|
**Step 1 — 准备构建目录**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
BUILD_DIR=/tmp/manual-build
|
||||||
|
rm -rf $BUILD_DIR && mkdir -p $BUILD_DIR/target
|
||||||
|
```
|
||||||
|
|
||||||
|
**Step 2 — 复制 JDK 和 JAR**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cp -r /opt/jdk1.8.0_202 $BUILD_DIR/
|
||||||
|
cp /path/to/your-app.jar $BUILD_DIR/target/
|
||||||
|
cp /opt/docker-templates/Dockerfile $BUILD_DIR/
|
||||||
|
```
|
||||||
|
|
||||||
|
**Step 3 — Docker Build**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker build -t jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1 $BUILD_DIR
|
||||||
|
```
|
||||||
|
|
||||||
|
**Step 4 — 登录 ACR**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
echo 'idurCT!rIq9EzISD' | docker login --username=10952138@qq.com --password-stdin jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com
|
||||||
|
```
|
||||||
|
|
||||||
|
**Step 5 — 推送镜像**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker push jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||||
|
```
|
||||||
|
|
||||||
|
**Step 6 — 清理**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rm -rf $BUILD_DIR
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 从源码构建(Maven 打包 + Docker 构建)
|
||||||
|
|
||||||
|
如果拿到的是 Java 源码而不是编译好的 JAR:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
source /etc/profile.d/java.sh
|
||||||
|
source /etc/profile.d/maven.sh
|
||||||
|
|
||||||
|
# Maven 编译打包
|
||||||
|
cd /path/to/project
|
||||||
|
mvn clean package -DskipTests
|
||||||
|
|
||||||
|
# 然后用编译好的 JAR 走上面的构建流程
|
||||||
|
/opt/docker-templates/build.sh <app-name> <env-prefix> target/xxx.jar 1
|
||||||
|
```
|
||||||
|
|
||||||
|
Maven 已配置阿里云镜像(`maven.aliyun.com/repository/public`),依赖下载速度约 200-400 KB/s。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### K8s 部署命令
|
||||||
|
|
||||||
|
**创建新 Deployment:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/usr/bin/kubectl create deployment jjb-saas-safety-eval \
|
||||||
|
--image=jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1 \
|
||||||
|
-n jjb-dragon --replicas=1
|
||||||
|
```
|
||||||
|
|
||||||
|
**更新已有 Deployment 的镜像:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/usr/bin/kubectl set image deployment/jjb-saas-safety-eval \
|
||||||
|
jjb-saas-safety-eval=jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1 \
|
||||||
|
-n jjb-dragon
|
||||||
|
```
|
||||||
|
|
||||||
|
**查看 Pod 状态:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/usr/bin/kubectl get pods -n jjb-dragon | grep safety-eval
|
||||||
|
```
|
||||||
|
|
||||||
|
**查看日志:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/usr/bin/kubectl logs -f deployment/jjb-saas-safety-eval -n jjb-dragon
|
||||||
|
```
|
||||||
|
|
||||||
|
**查看 Deployment 详情:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/usr/bin/kubectl describe deployment jjb-saas-safety-eval -n jjb-dragon
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 常用查询命令
|
||||||
|
|
||||||
|
**查看本地镜像:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker images | grep jjb-saas-safety-eval
|
||||||
|
```
|
||||||
|
|
||||||
|
**查看镜像详情:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker inspect jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||||
|
```
|
||||||
|
|
||||||
|
**查看镜像构建历史:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker history jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||||
|
```
|
||||||
|
|
||||||
|
**本地测试运行:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run --rm -it --name safety-eval-test \
|
||||||
|
-p 8080:8080 \
|
||||||
|
jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||||
|
```
|
||||||
|
|
||||||
|
**列出 ACR 上所有已有镜像:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker images --format '{{.Repository}}:{{.Tag}}' | grep 'ali_img_ns'
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 构建环境安装
|
||||||
|
|
||||||
|
首次使用新机器时,运行 `install_env.sh` 一键安装全部构建依赖:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh root@192.168.20.100
|
||||||
|
bash install_env.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
该脚本会安装并配置:JDK 1.8.0_202、Maven 3.8.8(阿里云镜像)、Dockerfile 模板、yum vault 源、ACR 登录。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Dockerfile 结构说明
|
||||||
|
|
||||||
|
镜像内部结构(从已有运行镜像逆向分析得出):
|
||||||
|
|
||||||
|
```
|
||||||
|
/
|
||||||
|
├── opt/
|
||||||
|
│ ├── jdk1.8.0_202/ ← Oracle JDK 1.8.0_202
|
||||||
|
│ ├── app.jar ← 应用 JAR 包
|
||||||
|
│ └── logs/ ← 日志目录
|
||||||
|
```
|
||||||
|
|
||||||
|
容器启动命令(ENTRYPOINT):
|
||||||
|
|
||||||
|
```
|
||||||
|
/opt/jdk1.8.0_202/bin/java
|
||||||
|
-Dnacos.namespace=jjb-dragon
|
||||||
|
-Dnacos.url=prod-nacos:8848
|
||||||
|
-Dspring.profiles.active=prod
|
||||||
|
-Dmysql.password=***
|
||||||
|
-Dmysql.host=192.168.20.100
|
||||||
|
-Dmysql.port=33080
|
||||||
|
-Dmysql.username=root
|
||||||
|
-jar /opt/app.jar
|
||||||
|
```
|
||||||
|
|
||||||
|
运行时可通过 K8s deployment 的 `args` 或 `env` 字段覆盖以上参数。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 故障排查
|
||||||
|
|
||||||
|
**问题:`yum install` 报错 404**
|
||||||
|
CentOS 7 已 EOL,确认 `/etc/yum.repos.d/CentOS-Base.repo` 使用 `centos-vault` 源(install_env.sh 会自动处理)。
|
||||||
|
|
||||||
|
**问题:Maven 下载依赖慢**
|
||||||
|
检查 `/root/.m2/settings.xml` 是否配置了阿里云镜像,mirrorOf 应为 `central`。
|
||||||
|
|
||||||
|
**问题:`docker push` 报 unauthorized**
|
||||||
|
重新登录 ACR:`echo 'idurCT!rIq9EzISD' | docker login --username=10952138@qq.com --password-stdin jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com`
|
||||||
|
|
||||||
|
**问题:K8s 拉取镜像失败 (ImagePullBackOff)**
|
||||||
|
确认 `jjb-dragon` namespace 下有 `image-pull-secret` 或 `image-pull-secret1`:
|
||||||
|
```bash
|
||||||
|
/usr/bin/kubectl get secret -n jjb-dragon | grep image-pull
|
||||||
|
```
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# ============================================================
|
||||||
|
# GBS Application Build & Push Script (Shell version)
|
||||||
|
# Run on master node: 192.168.20.100
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# ./build.sh <app-name> <env-prefix> <jar-file> [version-suffix]
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# ./build.sh jjb-saas-safety-eval ota /tmp/safety-eval.jar 1
|
||||||
|
#
|
||||||
|
# Result image:
|
||||||
|
# jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# ---- Parameters ----
|
||||||
|
APP_NAME=${1:?"Usage: $0 <app-name> <env-prefix> <jar-file> [version-suffix]"}
|
||||||
|
ENV_PREFIX=${2:?"Usage: $0 <app-name> <env-prefix> <jar-file> [version-suffix]"}
|
||||||
|
JAR_FILE=${3:?"Usage: $0 <app-name> <env-prefix> <jar-file> [version-suffix]"}
|
||||||
|
VERSION_SUFFIX=${4:-1}
|
||||||
|
|
||||||
|
# ---- Constants ----
|
||||||
|
ACR_REGISTRY="jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com"
|
||||||
|
ACR_NAMESPACE="ali_img_ns"
|
||||||
|
ACR_USER="10952138@qq.com"
|
||||||
|
ACR_PASS='idurCT!rIq9EzISD'
|
||||||
|
DATE_TAG=$(date +%Y%m%d)
|
||||||
|
IMAGE_TAG="${ENV_PREFIX}-${DATE_TAG}-${VERSION_SUFFIX}"
|
||||||
|
FULL_IMAGE="${ACR_REGISTRY}/${ACR_NAMESPACE}/prod-aly-${ENV_PREFIX}-dragon-${APP_NAME}:${IMAGE_TAG}"
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
|
|
||||||
|
# Source environment
|
||||||
|
source /etc/profile.d/java.sh 2>/dev/null || true
|
||||||
|
source /etc/profile.d/maven.sh 2>/dev/null || true
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo " GBS Docker Build & Push"
|
||||||
|
echo "=========================================="
|
||||||
|
echo "App: ${APP_NAME}"
|
||||||
|
echo "Tag: ${IMAGE_TAG}"
|
||||||
|
echo "JAR: ${JAR_FILE}"
|
||||||
|
echo "Image: ${FULL_IMAGE}"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
|
# ---- Step 1: Verify JAR ----
|
||||||
|
if [ ! -f "${JAR_FILE}" ]; then
|
||||||
|
echo "ERROR: JAR file not found: ${JAR_FILE}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "[1/4] JAR verified: $(ls -lh ${JAR_FILE} | awk '{print $5}')"
|
||||||
|
|
||||||
|
# ---- Step 2: Prepare build context ----
|
||||||
|
BUILD_DIR="/tmp/docker-build-${APP_NAME}-$$"
|
||||||
|
echo "[2/4] Preparing build context at ${BUILD_DIR}..."
|
||||||
|
mkdir -p ${BUILD_DIR}/target
|
||||||
|
cp -r /opt/jdk1.8.0_202 ${BUILD_DIR}/
|
||||||
|
cp ${JAR_FILE} ${BUILD_DIR}/target/
|
||||||
|
cp ${SCRIPT_DIR}/Dockerfile ${BUILD_DIR}/
|
||||||
|
echo " Build context size: $(du -sh ${BUILD_DIR} | awk '{print $1}')"
|
||||||
|
|
||||||
|
# ---- Step 3: Docker build ----
|
||||||
|
echo "[3/4] Building Docker image..."
|
||||||
|
docker build -t "${FULL_IMAGE}" "${BUILD_DIR}"
|
||||||
|
echo " Image size: $(docker images --format '{{.Size}}' ${FULL_IMAGE})"
|
||||||
|
|
||||||
|
# ---- Step 4: Push to ACR ----
|
||||||
|
echo "[4/4] Pushing to ACR..."
|
||||||
|
echo "${ACR_PASS}" | docker login --username="${ACR_USER}" --password-stdin "${ACR_REGISTRY}" 2>/dev/null
|
||||||
|
docker push "${FULL_IMAGE}"
|
||||||
|
|
||||||
|
# ---- Cleanup ----
|
||||||
|
rm -rf "${BUILD_DIR}"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo " BUILD COMPLETE"
|
||||||
|
echo "=========================================="
|
||||||
|
echo "Image: ${FULL_IMAGE}"
|
||||||
|
echo ""
|
||||||
|
echo "Deploy to K8s:"
|
||||||
|
echo " /usr/bin/kubectl create deployment ${APP_NAME} --image=${FULL_IMAGE} -n jjb-dragon --replicas=1"
|
||||||
|
echo " /usr/bin/kubectl set image deployment/${APP_NAME} ${APP_NAME}=${FULL_IMAGE} -n jjb-dragon"
|
||||||
|
echo "=========================================="
|
||||||
|
|
@ -0,0 +1,166 @@
|
||||||
|
"""
|
||||||
|
GBS Application Build & Push Script (Python version)
|
||||||
|
Run from local Windows machine - handles SFTP upload + remote build + push.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
python build_push.py <jar-file> <app-name> <env-prefix> [version-suffix]
|
||||||
|
|
||||||
|
Example:
|
||||||
|
python build_push.py E:\\projects\\xxx\\target\\app.jar jjb-saas-safety-eval ota 1
|
||||||
|
|
||||||
|
Result image:
|
||||||
|
jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||||
|
"""
|
||||||
|
|
||||||
|
import paramiko
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
# ---- Configuration ----
|
||||||
|
MASTER = "192.168.20.100"
|
||||||
|
SSH_USER = "root"
|
||||||
|
SSH_PASSWD = "Zcloud@zcloud100"
|
||||||
|
|
||||||
|
ACR_REGISTRY = "jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com"
|
||||||
|
ACR_NAMESPACE = "ali_img_ns"
|
||||||
|
ACR_USER = "10952138@qq.com"
|
||||||
|
ACR_PASS = "idurCT!rIq9EzISD"
|
||||||
|
|
||||||
|
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
DOCKERFILE_PATH = os.path.join(SCRIPT_DIR, "Dockerfile")
|
||||||
|
|
||||||
|
|
||||||
|
def ssh_exec(client, cmd, timeout=600):
|
||||||
|
"""Execute SSH command and print results."""
|
||||||
|
print(f" > {cmd[:120]}{'...' if len(cmd) > 120 else ''}")
|
||||||
|
stdin, stdout, stderr = client.exec_command(cmd, timeout=timeout)
|
||||||
|
out = stdout.read().decode('utf-8', errors='replace')
|
||||||
|
err = stderr.read().decode('utf-8', errors='replace')
|
||||||
|
exit_code = stdout.channel.recv_exit_status()
|
||||||
|
if out.strip():
|
||||||
|
for line in out.strip().split('\n')[-10:]: # last 10 lines
|
||||||
|
print(f" {line}")
|
||||||
|
if err.strip():
|
||||||
|
important = [l for l in err.strip().split('\n')
|
||||||
|
if not any(x in l for x in ['Downloading', 'Downloaded', 'Extracting', 'Progress'])]
|
||||||
|
if important:
|
||||||
|
print(f" [stderr] {'; '.join(important[:5])}")
|
||||||
|
return out.strip(), err.strip(), exit_code
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) < 4:
|
||||||
|
print(__doc__)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
jar_local = sys.argv[1]
|
||||||
|
app_name = sys.argv[2]
|
||||||
|
env_prefix = sys.argv[3]
|
||||||
|
version_suffix = sys.argv[4] if len(sys.argv) > 4 else "1"
|
||||||
|
|
||||||
|
date_tag = datetime.now().strftime("%Y%m%d")
|
||||||
|
image_tag = f"{env_prefix}-{date_tag}-{version_suffix}"
|
||||||
|
full_image = f"{ACR_REGISTRY}/{ACR_NAMESPACE}/prod-aly-{env_prefix}-dragon-{app_name}:{image_tag}"
|
||||||
|
|
||||||
|
if not os.path.exists(jar_local):
|
||||||
|
print(f"ERROR: JAR file not found: {jar_local}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
jar_size_mb = os.path.getsize(jar_local) / 1024 / 1024
|
||||||
|
build_dir = f"/tmp/docker-build-{app_name}"
|
||||||
|
jar_name = os.path.basename(jar_local)
|
||||||
|
|
||||||
|
print("=" * 60)
|
||||||
|
print(f" GBS Docker Build & Push (Remote)")
|
||||||
|
print("=" * 60)
|
||||||
|
print(f" JAR: {jar_local} ({jar_size_mb:.1f} MB)")
|
||||||
|
print(f" App: {app_name}")
|
||||||
|
print(f" Tag: {image_tag}")
|
||||||
|
print(f" Image: {full_image}")
|
||||||
|
print(f" Target: {MASTER}")
|
||||||
|
print("=" * 60)
|
||||||
|
|
||||||
|
# ---- Connect ----
|
||||||
|
client = paramiko.SSHClient()
|
||||||
|
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||||
|
client.connect(MASTER, username=SSH_USER, password=SSH_PASSWD, timeout=30)
|
||||||
|
print("\n[1/5] SSH connected")
|
||||||
|
|
||||||
|
# ---- Prepare remote dir ----
|
||||||
|
ssh_exec(client, f"rm -rf {build_dir} && mkdir -p {build_dir}/target")
|
||||||
|
|
||||||
|
# ---- Upload JAR ----
|
||||||
|
print(f"\n[2/5] Uploading JAR ({jar_size_mb:.1f} MB)...")
|
||||||
|
sftp = client.open_sftp()
|
||||||
|
remote_jar = f"{build_dir}/target/{jar_name}"
|
||||||
|
start = time.time()
|
||||||
|
last_pct = -1
|
||||||
|
|
||||||
|
def progress(transferred, total):
|
||||||
|
nonlocal last_pct
|
||||||
|
pct = int(transferred * 100 / total)
|
||||||
|
if pct >= last_pct + 10:
|
||||||
|
last_pct = pct
|
||||||
|
mb = transferred / 1024 / 1024
|
||||||
|
elapsed = time.time() - start
|
||||||
|
speed = mb / elapsed if elapsed > 0 else 0
|
||||||
|
print(f" {pct}% ({mb:.1f} MB) - {speed:.1f} MB/s")
|
||||||
|
|
||||||
|
sftp.put(jar_local, remote_jar, callback=progress)
|
||||||
|
elapsed = time.time() - start
|
||||||
|
print(f" Done in {elapsed:.1f}s ({jar_size_mb/elapsed:.1f} MB/s)")
|
||||||
|
sftp.close()
|
||||||
|
|
||||||
|
# ---- Upload Dockerfile ----
|
||||||
|
ssh_exec(client, f"cat > {build_dir}/Dockerfile", timeout=10)
|
||||||
|
with open(DOCKERFILE_PATH, 'r', encoding='utf-8') as f:
|
||||||
|
dockerfile_content = f.read()
|
||||||
|
stdin, stdout, stderr = client.exec_command(f"cat > {build_dir}/Dockerfile")
|
||||||
|
stdin.write(dockerfile_content)
|
||||||
|
stdin.channel.shutdown_write()
|
||||||
|
stdout.read()
|
||||||
|
|
||||||
|
# ---- Copy JDK into context ----
|
||||||
|
print("\n[3/5] Preparing build context...")
|
||||||
|
ssh_exec(client, f"cp -r /opt/jdk1.8.0_202 {build_dir}/", timeout=120)
|
||||||
|
ssh_exec(client, f"du -sh {build_dir}/")
|
||||||
|
|
||||||
|
# ---- Docker build ----
|
||||||
|
print("\n[4/5] Building Docker image...")
|
||||||
|
out, err, code = ssh_exec(client, f"docker build -t '{full_image}' {build_dir}", timeout=300)
|
||||||
|
if code != 0:
|
||||||
|
print("ERROR: Docker build failed!")
|
||||||
|
client.close()
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# ---- Push to ACR ----
|
||||||
|
print("\n[5/5] Pushing to ACR...")
|
||||||
|
ssh_exec(client, f"echo '{ACR_PASS}' | docker login --username={ACR_USER} --password-stdin {ACR_REGISTRY}")
|
||||||
|
out, err, code = ssh_exec(client, f"docker push '{full_image}'", timeout=600)
|
||||||
|
if code != 0:
|
||||||
|
print("ERROR: Docker push failed!")
|
||||||
|
client.close()
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# ---- Verify & Cleanup ----
|
||||||
|
ssh_exec(client, f"docker images | grep '{app_name}'")
|
||||||
|
ssh_exec(client, f"rm -rf {build_dir}")
|
||||||
|
client.close()
|
||||||
|
|
||||||
|
# ---- Summary ----
|
||||||
|
print("\n" + "=" * 60)
|
||||||
|
print(" BUILD COMPLETE")
|
||||||
|
print("=" * 60)
|
||||||
|
print(f"\n Image Address:\n {full_image}\n")
|
||||||
|
print(f" K8s Deploy:\n"
|
||||||
|
f" /usr/bin/kubectl create deployment {app_name} \\\n"
|
||||||
|
f" --image={full_image} -n jjb-dragon --replicas=1\n")
|
||||||
|
print(f" /usr/bin/kubectl set image deployment/{app_name} \\\n"
|
||||||
|
f" {app_name}={full_image} -n jjb-dragon\n")
|
||||||
|
print("=" * 60)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
@ -0,0 +1,216 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# ============================================================
|
||||||
|
# GBS Master Node Build Environment Installation Script
|
||||||
|
# Run on: 192.168.20.100 (CentOS 7)
|
||||||
|
#
|
||||||
|
# Installs:
|
||||||
|
# - Oracle JDK 1.8.0_202 (extracted from existing Docker image)
|
||||||
|
# - Apache Maven 3.8.8 (with Alibaba Cloud mirror)
|
||||||
|
# - Dockerfile template
|
||||||
|
# - yum vault mirrors (CentOS 7 EOL fix)
|
||||||
|
# - ACR login
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# bash install_env.sh
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo " GBS Build Environment Setup"
|
||||||
|
echo " Host: $(hostname) ($(hostname -I 2>/dev/null || echo 'unknown'))"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
|
# ---- Step 1: Extract JDK from existing Docker image ----
|
||||||
|
echo ""
|
||||||
|
echo "[1/6] Installing JDK 1.8.0_202..."
|
||||||
|
|
||||||
|
if [ -d "/opt/jdk1.8.0_202" ] && [ -x "/opt/jdk1.8.0_202/bin/java" ]; then
|
||||||
|
echo " JDK already installed, skipping."
|
||||||
|
else
|
||||||
|
# Find an image with JDK
|
||||||
|
IMAGE=$(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'ali_img_ns' | head -1)
|
||||||
|
if [ -z "$IMAGE" ]; then
|
||||||
|
echo "ERROR: No suitable Docker image found with JDK!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo " Extracting JDK from: $IMAGE"
|
||||||
|
docker rm -f jdk-extract-tmp 2>/dev/null || true
|
||||||
|
docker create --name jdk-extract-tmp "$IMAGE" /bin/true > /dev/null
|
||||||
|
docker cp jdk-extract-tmp:/opt/jdk1.8.0_202 /opt/jdk1.8.0_202
|
||||||
|
docker rm jdk-extract-tmp > /dev/null
|
||||||
|
echo " JDK extracted to /opt/jdk1.8.0_202"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configure JAVA_HOME
|
||||||
|
cat > /etc/profile.d/java.sh << 'EOF'
|
||||||
|
export JAVA_HOME=/opt/jdk1.8.0_202
|
||||||
|
export PATH=$JAVA_HOME/bin:$PATH
|
||||||
|
EOF
|
||||||
|
chmod +x /etc/profile.d/java.sh
|
||||||
|
source /etc/profile.d/java.sh
|
||||||
|
echo " $(java -version 2>&1 | head -1)"
|
||||||
|
|
||||||
|
# ---- Step 2: Install Maven ----
|
||||||
|
echo ""
|
||||||
|
echo "[2/6] Installing Maven 3.8.8..."
|
||||||
|
|
||||||
|
if [ -x "/opt/maven/bin/mvn" ]; then
|
||||||
|
echo " Maven already installed, skipping."
|
||||||
|
else
|
||||||
|
MAVEN_VERSION="3.8.8"
|
||||||
|
MAVEN_URLS=(
|
||||||
|
"https://mirrors.aliyun.com/apache/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz"
|
||||||
|
"https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz"
|
||||||
|
)
|
||||||
|
DOWNLOADED=0
|
||||||
|
for url in "${MAVEN_URLS[@]}"; do
|
||||||
|
echo " Trying: $url"
|
||||||
|
if curl -fsSL -o /tmp/maven.tar.gz "$url" --connect-timeout 15 --max-time 300; then
|
||||||
|
DOWNLOADED=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ $DOWNLOADED -eq 0 ]; then
|
||||||
|
echo "ERROR: Could not download Maven!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
mkdir -p /opt/maven
|
||||||
|
tar -xzf /tmp/maven.tar.gz -C /opt/maven --strip-components=1
|
||||||
|
rm -f /tmp/maven.tar.gz
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configure Maven environment
|
||||||
|
cat > /etc/profile.d/maven.sh << 'EOF'
|
||||||
|
export MAVEN_HOME=/opt/maven
|
||||||
|
export PATH=$MAVEN_HOME/bin:$PATH
|
||||||
|
EOF
|
||||||
|
chmod +x /etc/profile.d/maven.sh
|
||||||
|
source /etc/profile.d/maven.sh
|
||||||
|
|
||||||
|
# Configure Alibaba Maven mirror
|
||||||
|
mkdir -p /root/.m2
|
||||||
|
cat > /root/.m2/settings.xml << 'XMLEOF'
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
|
||||||
|
<localRepository>/root/.m2/repository</localRepository>
|
||||||
|
<mirrors>
|
||||||
|
<mirror>
|
||||||
|
<id>aliyunmaven</id>
|
||||||
|
<name>Alibaba Cloud Maven Mirror</name>
|
||||||
|
<url>https://maven.aliyun.com/repository/public</url>
|
||||||
|
<mirrorOf>central</mirrorOf>
|
||||||
|
</mirror>
|
||||||
|
</mirrors>
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>alibaba-repos</id>
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>aliyun-public</id>
|
||||||
|
<url>https://maven.aliyun.com/repository/public</url>
|
||||||
|
<releases><enabled>true</enabled></releases>
|
||||||
|
<snapshots><enabled>true</enabled></snapshots>
|
||||||
|
</repository>
|
||||||
|
<repository>
|
||||||
|
<id>aliyun-spring</id>
|
||||||
|
<url>https://maven.aliyun.com/repository/spring</url>
|
||||||
|
<releases><enabled>true</enabled></releases>
|
||||||
|
<snapshots><enabled>true</enabled></snapshots>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
<pluginRepositories>
|
||||||
|
<pluginRepository>
|
||||||
|
<id>aliyun-plugin</id>
|
||||||
|
<url>https://maven.aliyun.com/repository/public</url>
|
||||||
|
<releases><enabled>true</enabled></releases>
|
||||||
|
<snapshots><enabled>true</enabled></snapshots>
|
||||||
|
</pluginRepository>
|
||||||
|
</pluginRepositories>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
<activeProfiles>
|
||||||
|
<activeProfile>alibaba-repos</activeProfile>
|
||||||
|
</activeProfiles>
|
||||||
|
</settings>
|
||||||
|
XMLEOF
|
||||||
|
cp /root/.m2/settings.xml /opt/maven/conf/settings.xml
|
||||||
|
echo " Maven $(mvn -version 2>&1 | head -1)"
|
||||||
|
|
||||||
|
# ---- Step 3: Fix yum repos (CentOS 7 EOL) ----
|
||||||
|
echo ""
|
||||||
|
echo "[3/6] Configuring yum vault mirrors..."
|
||||||
|
|
||||||
|
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak.$(date +%Y%m%d) 2>/dev/null || true
|
||||||
|
cat > /etc/yum.repos.d/CentOS-Base.repo << 'YUMEOF'
|
||||||
|
[base]
|
||||||
|
name=CentOS-7 - Base - vault.aliyun.com
|
||||||
|
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/os/x86_64/
|
||||||
|
gpgcheck=1
|
||||||
|
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||||
|
enabled=1
|
||||||
|
|
||||||
|
[updates]
|
||||||
|
name=CentOS-7 - Updates - vault.aliyun.com
|
||||||
|
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/updates/x86_64/
|
||||||
|
gpgcheck=1
|
||||||
|
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||||
|
enabled=1
|
||||||
|
|
||||||
|
[extras]
|
||||||
|
name=CentOS-7 - Extras - vault.aliyun.com
|
||||||
|
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/extras/x86_64/
|
||||||
|
gpgcheck=1
|
||||||
|
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||||
|
enabled=1
|
||||||
|
YUMEOF
|
||||||
|
yum clean all > /dev/null 2>&1
|
||||||
|
yum makecache fast > /dev/null 2>&1
|
||||||
|
echo " yum repos configured (aliyun centos-vault)"
|
||||||
|
|
||||||
|
# ---- Step 4: Verify Docker ----
|
||||||
|
echo ""
|
||||||
|
echo "[4/6] Verifying Docker..."
|
||||||
|
echo " Docker $(docker --version)"
|
||||||
|
|
||||||
|
# ---- Step 5: Login to ACR ----
|
||||||
|
echo ""
|
||||||
|
echo "[5/6] Logging in to ACR..."
|
||||||
|
echo 'idurCT!rIq9EzISD' | docker login --username=10952138@qq.com --password-stdin jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com 2>&1 | grep -v WARNING
|
||||||
|
|
||||||
|
# ---- Step 6: Install Dockerfile template ----
|
||||||
|
echo ""
|
||||||
|
echo "[6/6] Installing Dockerfile template..."
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
|
mkdir -p /opt/docker-templates
|
||||||
|
if [ -f "${SCRIPT_DIR}/Dockerfile" ]; then
|
||||||
|
cp "${SCRIPT_DIR}/Dockerfile" /opt/docker-templates/
|
||||||
|
echo " Dockerfile copied to /opt/docker-templates/"
|
||||||
|
fi
|
||||||
|
if [ -f "${SCRIPT_DIR}/build.sh" ]; then
|
||||||
|
cp "${SCRIPT_DIR}/build.sh" /opt/docker-templates/
|
||||||
|
chmod +x /opt/docker-templates/build.sh
|
||||||
|
echo " build.sh copied to /opt/docker-templates/"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ---- Summary ----
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo " INSTALLATION COMPLETE"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
echo " Java: $(/opt/jdk1.8.0_202/bin/java -version 2>&1 | head -1)"
|
||||||
|
echo " Maven: $(/opt/maven/bin/mvn -version 2>&1 | head -1)"
|
||||||
|
echo " Docker: $(docker --version)"
|
||||||
|
echo ""
|
||||||
|
echo " JAVA_HOME=/opt/jdk1.8.0_202"
|
||||||
|
echo " MAVEN_HOME=/opt/maven"
|
||||||
|
echo " Dockerfile: /opt/docker-templates/Dockerfile"
|
||||||
|
echo " Build script: /opt/docker-templates/build.sh"
|
||||||
|
echo ""
|
||||||
|
echo " NOTE: Run 'source /etc/profile.d/java.sh' and"
|
||||||
|
echo " 'source /etc/profile.d/maven.sh' or re-login"
|
||||||
|
echo " to use java/mvn commands."
|
||||||
|
echo "=========================================="
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Administrator | ||||||