环境信息:
-
系统: Windows 11 + WSL2 (Ubuntu 22.04)
-
部署: Docker Compose 源码部署
-
需求: 在 Sandbox 中运行数学建模代码(需
networkx和pulp+ 系统级求解器glpk/cbc)。
问题描述: 我自定义了 sandbox 镜像并修改了 docker-compose.yml,现在陷入了一个诡异的“报错循环”,无法同时满足依赖存在和权限足够两个条件:
核心矛盾(The Loop):
-
状态 A:报错 “ModuleNotFoundError”
-
当我尝试重新构建镜像确保库存在时,Web 端提示找不到库。
-
但此时进入容器
docker exec检查,库是存在的。
-
-
状态 B:报错 “error: operation not permitted”
-
为了解决 PuLP 求解器的权限问题,我在
docker-compose.yml中配置了security_opt: seccomp:unconfined和privileged: true。 -
一旦权限似乎生效(或者我重启服务刷新配置后),报错就变成了 “No module named ‘networkx’”。
-
如果我设法让库能被找到,代码运行到
prob.solve()时又会变回 “operation not permitted”。
-
我的配置:
1. Dockerfile.sandbox (如下)
FROM langgenius/dify-sandbox:latest
USER root
RUN apt-get update && apt-get install -y coinor-cbc glpk-utils
RUN pip install --no-cache-dir --default-timeout=1000 -i Simple Index
numpy
pandas
scipy
RUN pip install --no-cache-dir --default-timeout=1000 -i Simple Index
networkx
pulp
scikit-opt
statsmodels
scikit-learn
scienceplots
openpyxl
2. docker-compose.yml (确保放开了权限)
sandbox:
image: my-math-sandbox:local
container_name: docker-sandbox-1
restart: always
privileged: true
security_opt:
- seccomp:unconfined
- apparmor:unconfined
cap_add:
- SYS_PTRACE
已验证的事实:
-
镜像构建无误: 使用
docker run --rm -it my-math-sandbox:local python3 -c "import pulp; print('ok')"测试,库和求解器都工作正常。 -
容器运行中:
docker ps显示 sandbox 确实加载了my-math-sandbox:local镜像。 -
Exec 测试成功: 在容器运行时,使用
docker exec -it docker-sandbox-1 python3手动运行脚本,完全正常,无权限错误,无缺库错误.
求助核心: 为什么 Dify Web 端 (Go Runner) 执行代码的环境,与我 docker exec 进入的环境表现如此不同?
-
是否 Dify 的 Runner 在启动 Python 进程时,会忽略 Docker Compose 的
security_opt? -
或者当开启特权模式后,Runner 会挂载不同的文件系统导致我的
pip install失效?
恳请大佬指点排查方向!被这个循环折磨两天了