Dify应用实战番外 - 网友提问(2)
Dify应用实战番外 - 网友提问(2)
麦金叔的AI之旅**01.**动手做一做
随便创建一个工作流。添加”代码执行”和”结束”。
并填入代码如下:
保存后进行测试。结果如下图:
提示非常清楚,就是找不到依赖库pandas。
那我们就把库安装上,因为运行时是由sandbox提供的,所以我们找到docker-compose.yaml中sandbox的定义。其中有个卷的映射,
./volumes/sandbox/dependencies:/dependencies
这里就是我们添加依赖的地方。工程目录下docker/volumes/sandbox/dependencies下有一个空文件python-requirements.txt
输入一行"pandas==2.2.3"
重启docker服务,查看docker-sandbox-1的日志,会看到在启动sandbox时,会安装第三方库。
重新运行”工作流”(如果还报错找不到pandas,需要等待一会儿,安装有可能还没有完成,一定要看到sandbox的log里面显示python dependencies installed)。发现已经不再报错找不到pandas,而是提示另外一个错误。
绝望了呀,赶紧问问DeepSeek和豆包是咋回事啊。
好的,它们都说是沙盒环境的权限限制导致的,但好歹也要给出如何修改的建议吧?对不起,没有,请自行解决。
这下难题还是留给了麦金叔,只能硬着头皮上了。
**02.**解决沙盒权限
通过官方dify-sandbox开源项目的FAQ,知道由于怕沙盒权限太大,导致不可控风险,所以本着最小化开放权限的原则,缺省的权限就很小。
知道问题的根结,那应该就很好解决了。
方案一
和刚才添加依赖一样,工程目录下docker/volumes/sandbox/conf里面有一个config.yaml文件,找到allowed_syscalls段,把需要的权限加进去。
重新启动服务之后,测试就通过了。
方案二
修改源代码,/internal/static/python\_syscall/syscalls\_amd64.go
把所需要的权限都添加进去,这里是以syscall开头的枚举值。如果出现所需要的权限没有定义,也不要紧,直接写数值也可以的。
改完了之后,需要重新编译dify-sandbox镜像。并将自己编译的镜像tag,替换进docker-compose.yaml。
重新启动服务后,也可以运行。
这个方法适用于所有没有权限执行的第三方库。
不过Dify的”代码执行”最好不要有太过复杂的脚本执行,一个是难以调试,另一个也是容易执行超时。
如果很依赖Python执行,可以按照”插件”的方案。将其封装为一个插件,每个插件也可以定义自己的requirements。这样也就不用怕没有权限了。
总结
今天的答疑来自网友的留言问题,当然有可能他说的Python脚本不能执行的问题,还不是这篇文章介绍的。请务必要理解,Dify的Python执行环境是独立的,和本机的Python环境没有关系,哪怕就是本机运行的容器环境。