Fork me on GitHub

将 NocoBase 从运行在 CentOS 8迁移到 RHEL 7.9 上的兼容性测试

前情提要:

nocobase部署笔记

在无法联网的生产环境部署nocobase

现在遇到一个问题,开发环境的操作系统/Docker都用最新版本,但是生产环境的基础软件版本太低,你要怎么办?

将 NocoBase 从运行在 CentOS 8(内核 4.18)迁移到 RHEL 7.9 上(默认内核通常是 3.10.x)理论上可行,但你需要注意几个兼容性问题,尤其是内核和系统库的版本差异对 Docker 和某些依赖的影响。

最优解:直接上生产上部署试一试,如果没办法上生产,那么可以使用模拟环境做一下测试

拉取 RHEL 7.9 容器模拟测试兼容性

用 ubi7 镜像测试 NocoBase 镜像兼容性的 Dockerfile 和启动脚本,用以模拟目标环境里的构建行为


✅ 功能列表

  1. 构建 UBI7 容器基础镜像
  2. 启动 NocoBase + MySQL + Flask 服务
  3. 输出容器状态与运行日志
  4. 验证端口监听情况(13000, 3306, 5000)
  5. **添加容器级别的 healthcheck**;
  6. 检查 Flask 接口是否可用(curl 检测)
  7. 最终输出整体运行状态报告

📁 目录结构建议

1
2
3
4
5
6
7
8
ubi_test/
├── Dockerfile
├── docker-compose.yml
├── run.sh
├── flask_service/
│ ├── Dockerfile
│ ├── app.py
│ └── requirements.txt

ubi_test/docker-compose.yml(增强版,含 Flask + healthcheck)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
version: '3.8'

networks:
nocobase:
driver: bridge

services:
mysql:
image: mysql:8.0
restart: always
networks:
- nocobase
environment:
MYSQL_ROOT_PASSWORD: XXXXXXXXXXXXXXXXXXXXX
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./uploads:/var/lib/mysql-files
command: --secure-file-priv=/var/lib/mysql-files
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5

app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:latest
restart: always
networks:
- nocobase
depends_on:
mysql:
condition: service_healthy
environment:
- APP_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXX
- DB_DIALECT=mysql
- DB_HOST=mysql
- DB_DATABASE=nocobase
- DB_USER=nocobase
- DB_PASSWORD=nocobase
- DB_UNDERSCORED=true
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- "13000:80"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 15s
timeout: 5s
retries: 5

flask:
build:
context: ./flask_service
dockerfile: Dockerfile
container_name: excel-importer
restart: always
networks:
- nocobase
environment:
- MYSQL_HOST=mysql
- MYSQL_PORT=3306
- MYSQL_USER=nocobase
- MYSQL_PASSWORD=nocobase
- MYSQL_DATABASE=nocobase
volumes:
- ./uploads:/app/uploads
ports:
- "5000:5000"
depends_on:
mysql:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5000/health"]
interval: 10s
timeout: 5s
retries: 5

volumes:
mysql_data:

✅ Flask 示例(路径:flask_service/app.py

1
2
3
4
5
6
7
8
9
10
from flask import Flask
app = Flask(__name__)

@app.route("/health")
def health():
return "OK", 200

@app.route("/")
def index():
return "Flask is running."

✅ Flask requirements.txt

1
flask

✅ Flask Dockerfileflask_service/Dockerfile

1
2
3
4
5
FROM python:3.9-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
CMD ["flask", "run", "--host=0.0.0.0", "--port=5000"]

run.sh 脚本增强版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/bin/bash
set -e

echo "[1] 构建基础 ubi7 环境镜像(可选)"
docker build -t ubi7-env ./ubi_test

echo "[2] 启动 docker-compose 环境..."
cd ubi_test
docker compose up -d --build

echo "[3] 等待服务启动中(最长等待 60 秒)..."
timeout=60
interval=5
elapsed=0

while [ $elapsed -lt $timeout ]; do
status=$(docker compose ps --services --filter "status=running" | wc -l)
if [ "$status" -ge 3 ]; then
echo "[✓] 所有服务已启动"
break
fi
sleep $interval
elapsed=$((elapsed + interval))
echo "[…] 正在等待服务启动(已等待 ${elapsed}s)"
done

if [ $elapsed -ge $timeout ]; then
echo "[✗] 启动超时,服务未全部运行"
docker compose ps
exit 1
fi

echo "[4] 服务健康检查:"

for service in mysql app flask; do
echo -n " - $service: "
health=$(docker inspect --format='{{json .State.Health.Status}}' "ubi_test_$service_1")
echo $health
done

echo "[5] 检查端口监听:"
for port in 13000 3306 5000; do
if lsof -i :"$port" > /dev/null 2>&1; then
echo " - Port $port is listening ✅"
else
echo " - Port $port is NOT listening ❌"
fi
done

echo "[6] 检查 Flask 服务接口响应:"
if curl -fs http://localhost:5000/health > /dev/null; then
echo " - Flask /health OK ✅"
else
echo " - Flask /health FAILED ❌"
fi

echo "[7] 输出 NocoBase 初始日志(前 30 行):"
docker logs --tail=30 ubi_test_app_1

echo "[✓] 测试完毕,你可以访问:http://localhost:13000"

✅ 使用方式:

1
2
3
# 进入 ubi_test 目录
chmod +x ubi_test/run.sh
./ubi_test/run.sh
-------------The End-------------