# Docker 部署 onnxruntime 问题修复指南 ## 问题描述 在 Docker 容器中部署时,如果遇到 `onnxruntime` DLL 加载失败的错误: ``` ImportError: DLL load failed while importing onnxruntime_pybind11_state: 动态链接库(DLL)初始化例程失败 ``` ## 解决方案 ### 1. 已更新的 Dockerfile `docker/adhServer.Dockerfile` 已经更新,添加了以下系统依赖: - `libgomp1` - OpenMP 支持(onnxruntime 需要) - `libgcc-s1` - GCC 运行时库 - `libstdc++6` - C++ 标准库 - `libc6` - C 标准库 ### 2. 重新构建 Docker 镜像 ```bash # 在项目根目录执行 docker-compose build --no-cache adhServer # 或者如果使用单独的 Dockerfile docker build -f docker/adhServer.Dockerfile -t adh-server:latest . ``` ### 3. 验证安装 启动容器后,可以通过以下方式验证 onnxruntime 是否正常工作: ```bash # 进入容器 docker exec -it python3 -c "import onnxruntime as ort; print(ort.get_available_providers())" ``` 如果成功,应该看到类似输出: ``` ['CPUExecutionProvider'] ``` ### 4. 如果仍然失败 #### 方案 A:使用 CPU 专用版本 如果标准版本仍然有问题,可以尝试安装 CPU 专用版本: 在 `requirements.txt` 中: ```txt onnxruntime==1.16.3 ``` 或者明确指定 CPU 版本: ```bash pip install onnxruntime==1.16.3 ``` #### 方案 B:检查 Python 版本兼容性 确保使用 Python 3.10(onnxruntime 1.16.3 支持 Python 3.8-3.11)。 #### 方案 C:使用延迟导入(已实现) 代码已经实现了延迟导入机制,即使 onnxruntime 加载失败,服务器也能正常启动,只是人脸检测功能会返回无脸结果。 ### 5. 调试步骤 如果问题仍然存在,可以: 1. **检查容器日志**: ```bash docker logs ``` 2. **检查系统库**: ```bash docker exec -it ldd /usr/local/lib/python3.10/site-packages/onnxruntime/capi/libonnxruntime_providers_shared.so ``` 3. **检查 Python 环境**: ```bash docker exec -it python3 -c "import sys; print(sys.version)" ``` ## 注意事项 - 确保 Docker 镜像基于 Debian Bookworm(或类似系统) - 如果使用其他基础镜像,可能需要调整包名(例如 Ubuntu 使用 `libgomp1`,CentOS 使用 `libgomp`) - 建议使用固定版本的 onnxruntime(当前为 1.16.3)以确保稳定性