Flask应用部署Linux后os.scandir()报FileNotFoundError问题求助
问题排查与解决
核心原因分析
你遇到的问题本质是Docker容器的文件系统隔离性导致的:宿主机上存在的/tasbiq/files/renault目录,默认不会被Docker容器访问到——你单独运行函数是在宿主机环境,所以能正常执行;但Flask应用在容器内运行,就看不到这个路径。
具体解决步骤
1. 给Docker容器挂载目标目录
这是最常见的修复点,启动容器时必须将宿主机的/tasbiq/files/renault目录挂载到容器内的对应路径:
- 用
docker run命令启动时,添加挂载参数:docker run -v /tasbiq/files/renault:/tasbiq/files/renault your-flask-image - 用
docker-compose.yml配置时,添加volumes字段:services: your-flask-service: image: your-flask-image volumes: - /tasbiq/files/renault:/tasbiq/files/renault
注意:要么保证宿主机和容器内的路径完全一致,要么修改代码里的files_path为容器内的挂载路径。
2. 检查目录权限
即使挂载了目录,容器内运行Flask的用户可能没有读取权限:
- 先查看宿主机目录权限:
ls -ld /tasbiq/files/renault - 临时用
root用户启动容器测试是否是权限问题:docker run -v /tasbiq/files/renault:/tasbiq/files/renault --user root your-flask-image
如果测试有效,再调整宿主机目录权限,比如开放其他用户的读写权限:
chmod o+rwx /tasbiq/files/renault
或者修改Dockerfile,指定运行用户并提前赋予目录权限。
3. 验证容器内路径是否存在
启动容器后,进入容器内部检查路径:
docker exec -it your-container-name bash # 进入容器后执行 ls -l /tasbiq/files/renault
如果显示目录不存在,说明挂载配置有误,重新核对挂载命令或docker-compose配置。
4. 代码优化(非当前问题根源,但建议修正)
你的get_files函数存在逻辑错误:os.scandir返回的是DirEntry对象,直接用os.path.join(path, file)会导致路径拼接错误,修正后的函数:
def get_files(path): print("CHECKING THE PATH: ", path) for file in os.scandir(path): if file.is_file(): # DirEntry自带is_file方法,更高效 print("FILE YIELDED IS: ", file) yield file
内容的提问来源于stack exchange,提问作者Kaiss B.
相关产品推荐
相关产品推荐

