filenotfounderror在docker中主因是路径映射或执行上下文错配;必须显式对齐工作目录、挂载路径与脚本位置:用绝对路径映射、映射前确认宿主机路径存在且含文件、进容器先ls验证内容、-w指定工作目录、避免硬编码相对路径、cmd前确认python可用及文件已copy。

FileNotFoundError 在 Docker 里出现,基本不是代码写错了,而是路径映射或执行上下文变了。直接结论:**容器内看到的路径 ≠ 你本地写的相对路径,必须显式对齐工作目录、挂载路径和脚本入口位置**。
docker run -v 映射时宿主机路径不存在,容器里就得到空目录
最隐蔽的坑:用 -v ./scripts:/app/scripts,但宿主机上根本没创建 ./scripts 目录——Docker 会静默创建一个空目录挂进去。结果容器里 /app/scripts 是个空文件夹,python /app/scripts/test.py 就报 can't find main module。
- 永远用绝对路径做 volume 映射:
-v $(pwd)/scripts:/app/scripts或-v /home/user/project/scripts:/app/scripts - 映射前先确认宿主机路径真实存在且含目标文件:
ls -l $(pwd)/scripts/test.py - 进容器第一件事不是跑脚本,而是
ls -l /app/scripts/看它到底有没有内容
WORKDIR 和 python 命令执行位置不一致,导致 import 失败
ModuleNotFoundError: No module named 'src' 的本质是 Python 的 sys.path[0] 不是你以为的项目根目录。比如 Dockerfile 写了 WORKDIR /app,但你在容器里执行的是 python /tmp/test.py,那 sys.path[0] 就是 /tmp,哪怕 src/ 在 /app/src 下也找不到。
- 用
-w强制指定工作目录:docker run -w /app python scripts/test.py - 避免在任意路径下直接执行脚本,改用
-m模块方式(前提是包结构正确):python -m pytest tests/ - 如果必须用相对导入,确保脚本是以模块方式启动,而不是当作顶层脚本执行
代码里写 ./data/train,容器里根本没这个相对起点
Python 脚本里的 open('./data/train') 会从当前工作目录拼路径。而 Docker 容器默认 CWD 是 / 或镜像里定义的 WORKDIR,跟你本地开发时的项目根目录很可能不同。
- 把所有硬编码的相对路径改成绝对路径,例如
/app/data/train(前提是/app是你的项目根目录) - 或者统一用
os.path.dirname(__file__)向上找,比如os.path.join(os.path.dirname(__file__), '..', 'data', 'train') - 别依赖
PYTHONPATH来救场——sys.path[0](脚本所在目录)永远优先于PYTHONPATH,它才是 import 的第一道门
CMD 写错格式,连 python 解释器都找不到
错误写法:CMD ["python", "/app/scripts/test.py"] 看似没问题,但如果镜像里没装 python 命令(只有 python3),或者 /app/scripts/test.py 根本没被 COPY 进去,就会报 /bin/sh: 1: [python,/app/scripts/test.py]: not found。
- 先进容器验证
python --version或python3 --version是否可用 - 检查
Dockerfile中是否真把脚本 COPY 进去了:COPY ./scripts /app/scripts,不是ADD误写成ADD ./scripts /app/导致覆盖 - CMD 推荐用 shell 形式明确路径:
CMD python3 /app/scripts/test.py,比 exec 形式更易调试
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











