You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:36:28