From 7fd77fa33c7f9bafdb6f658e1556db71c0ae7751 Mon Sep 17 00:00:00 2001 From: butubb <1422726308@qq.com> Date: Fri, 4 Sep 2026 16:23:17 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=AE=B9=E5=99=A8=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E5=B9=82=E7=AD=89=E2=80=94=E2=80=94=E4=BE=9D=E8=B5=96=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E6=AE=B5=E7=A7=BB=E5=85=A5=20start.sh=20=E5=B9=B6?= =?UTF-8?q?=E5=8A=A0=E3=80=8C=E5=B0=B1=E7=BB=AA=E5=8D=B3=E8=B7=B3=E8=BF=87?= =?UTF-8?q?=E3=80=8D=E5=AE=88=E5=8D=AB=EF=BC=88flask/u2/rapidocr/cv2=20?= =?UTF-8?q?=E5=85=A8=E9=83=A8=E5=8F=AF=E7=94=A8=E5=88=99=E7=A7=92=E7=BA=A7?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=EF=BC=89=EF=BC=9B=E9=85=8D=E5=90=88=20220=20?= =?UTF-8?q?compose=20=E5=8E=BB=E6=8E=89=20command=20=E9=87=8C=E7=9A=84=20p?= =?UTF-8?q?ip=20=E6=AE=B5=EF=BC=8C=E6=B6=88=E9=99=A4=E6=AF=8F=E6=AC=A1?= =?UTF-8?q?=E5=AE=B9=E5=99=A8=E9=87=8D=E5=90=AF=E9=87=8D=E8=A3=85=20opencv?= =?UTF-8?q?=205.0(73MB)=20=E5=B9=B6=E7=A0=B4=E5=9D=8F=20cv2=20=E7=9A=84?= =?UTF-8?q?=E5=B4=A9=E6=BA=83=E5=BE=AA=E7=8E=AF=E5=B8=AE=E5=87=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/start.sh | 44 +++++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/scripts/start.sh b/scripts/start.sh index f71425c..51d674b 100755 --- a/scripts/start.sh +++ b/scripts/start.sh @@ -1,6 +1,7 @@ #!/bin/bash -# 容器启动脚本:安装依赖 + 环境修复 + 启动 web_server。 -# compose 的 python-app 服务 command 指向本脚本。 +# 容器启动脚本:依赖安装(仅首次/缺失时)+ 环境修复 + 启动 web_server。 +# compose 的 python-app 服务 command 指向本脚本(不要在 compose 里再跑 pip, +# 否则每次容器重启都重装依赖——实测每轮重新下载 opencv 5.0(73MB) 并破坏 cv2)。 # # 为什么需要环境修复(必须在 pip install 之后): # rapidocr_onnxruntime 的依赖声明是 opencv-python(GUI 版),pip 解析依赖时 @@ -8,17 +9,35 @@ # 直接崩溃 → RapidOCR 不可用 → 条件判断的 OCR 步骤抛异常 → 任务失败退出。 # 因此在安装完 requirements 后,最后强制卸载 GUI 版并装 headless(幂等)。 # 本地 Mac 有 GUI 环境不受影响。 -if [ -f requirements.txt ]; then - pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt -fi -# 环境修复:最后强制 headless(覆盖 rapidocr 拉回的 GUI 版) -pip uninstall -y -q opencv-python 2>/dev/null || true -pip install -q -i https://pypi.tuna.tsinghua.edu.cn/simple "opencv-python-headless>=4.8,<5" # 5.x wheel 无 cv2 模块,锁定 4.x - -# pip 24.0 解压 abi3 wheel 偶发丢根文件(4.14.0.94 实测 site-packages/cv2 只剩子目录, -# cv2.abi3.so / __init__.py 缺失 → import cv2 成空壳,OCR 全挂)→ 空壳检测 + wheel 手动解压兜底(幂等) +# ---- 依赖就绪守卫:flask/u2/uiautodev/rapidocr/cv2 全部可用则跳过安装 ---- +# (容器重启秒级启动;只有首次部署或依赖缺失时才走完整安装) python3 - <<'PY' +import importlib.util, sys +mods = ("flask", "flask_login", "flask_sqlalchemy", "apscheduler", + "uiautomator2", "uiautodev", "rapidocr_onnxruntime", "PIL") +if all(importlib.util.find_spec(m) for m in mods): + try: + import cv2 + ok = hasattr(cv2, "__version__") and cv2.__file__ is not None + except Exception: + ok = False + sys.exit(0 if ok else 1) +sys.exit(1) +PY +if [ $? -ne 0 ]; then + echo "[start] 依赖缺失或 cv2 异常,执行安装与环境修复(首次启动较慢)..." + if [ -f requirements.txt ]; then + pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt + fi + + # 环境修复:最后强制 headless(覆盖 rapidocr 拉回的 GUI 版) + pip uninstall -y -q opencv-python 2>/dev/null || true + pip install -q -i https://pypi.tuna.tsinghua.edu.cn/simple "opencv-python-headless>=4.8,<5" # 5.x wheel 无 cv2 模块,锁定 4.x + + # pip 24.0 解压 abi3 wheel 偶发丢根文件(4.14.0.94 实测 site-packages/cv2 只剩子目录, + # cv2.abi3.so / __init__.py 缺失 → import cv2 成空壳,OCR 全挂)→ 空壳检测 + wheel 手动解压兜底(幂等) + python3 - <<'PY' import glob, os, shutil, site, subprocess, sys, zipfile def cv2_ok(): @@ -45,6 +64,9 @@ shutil.copytree("/tmp/ocv/cv2", dst) import cv2 print(f"cv2 {cv2.__version__} 手动解压修复完成") PY +else + echo "[start] 依赖已就绪(cv2 $(python3 -c 'import cv2; print(cv2.__version__)' 2>/dev/null)),跳过安装" +fi # 启动 MCP server(后台,AI 控制台/外部客户端经 127.0.0.1:8033 调用)。 # web_server.py 内 agent 依赖它,容器重启必须自动拉起(MCP_ENABLED=0 可关)。