Docker多容器环境下Dask Distributed调用upload_file出现FileNotFoundError的解决方案咨询
解决Dask Client upload_file找不到文件的问题
你遇到的核心问题大概率是相对路径解析偏差——虽然你说predict_worker.py和Flask运行代码在同一目录,但Flask进程的当前工作目录(CWD)可能和脚本所在目录不一致,导致相对路径无法定位到目标文件。下面是几个针对性的解决方案:
1. 使用绝对路径指定文件(最可靠方案)
放弃依赖相对路径,通过脚本的绝对路径拼接目标文件路径,这样无论Flask进程的工作目录是什么,都能精准找到文件。修改代码如下:
import os from dask.distributed import Client # 获取当前Flask脚本所在的绝对目录 current_script_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接predict_worker.py的绝对路径 predict_file_path = os.path.join(current_script_dir, 'predict_worker.py') # 初始化Dask Client并上传文件 dask_client = Client('127.0.0.1:8786') dask_client.upload_file(predict_file_path) # 确保myFunc是predict_worker.py中定义的函数,或者能被Worker正确加载 from predict_worker import myFunc results = dask_client.map(myFunc, [1])
2. 验证Flask进程的当前工作目录
可以在Flask代码中加入调试代码,确认进程的实际工作目录和文件存在性:
import os print("当前进程工作目录:", os.getcwd()) print("Flask脚本所在目录:", os.path.dirname(os.path.abspath(__file__))) print("脚本目录下的文件列表:", os.listdir(os.path.dirname(os.path.abspath(__file__))))
查看Flask容器的日志,如果当前工作目录和脚本目录不一致,那就是相对路径失效的直接原因。这种情况下,除了用绝对路径,也可以在启动Flask时切换到脚本所在目录(比如在Dockerfile中用WORKDIR指令指定脚本目录)。
3. 检查Docker容器内的文件状态
确保predict_worker.py确实被正确复制到了Flask容器的对应目录:
- 进入Flask容器执行
ls -l /path/to/flask/script/dir,查看文件是否存在且具备可读权限(权限至少为r--)。 - 如果是通过Dockerfile或Docker Compose构建容器,确认
COPY指令正确复制了该文件。
额外注意事项
- 文件上传后,Dask Worker会将其添加到Python的
sys.path中,所以提交任务时要确保任务代码能正确导入predict_worker.py中的内容(比如上面示例中从predict_worker导入myFunc)。 - 如果
myFunc是在Flask脚本中定义的,而非predict_worker.py内,需要确保该函数可被序列化,或者将函数所在的文件也一并上传。
内容的提问来源于stack exchange,提问作者ps0604
相关产品推荐
相关产品推荐

