Docker执行python脚本找不到文件怎么办

洛溪
洛溪
发布时间:2026-11-13| 7人浏览过
原创

针对Docker运行Python脚本时提示can't open file或No such file or directory的问题,系统梳理容器与宿主机隔离、卷挂载配置、WORKDIR工作目录、构建上下文过滤等核心根因,提供清晰的诊断流程、排查命令与标准修复方案。

在 Docker 容器中执行 Python 脚本提示找不到文件,最直接的原因是:目标文件根本不存在于容器文件系统内,或者执行命令时使用的路径与容器内部的当前工作目录不匹配。解决该问题只需完成三步定位:核对文件是否已经通过镜像构建(COPY)或运行期卷挂载(-v)送入容器、确认容器工作目录(WORKDIR)与相对路径是否对应,以及直接进入容器终端核验文件真实存在性。
Docker执行python脚本找不到文件怎么办
图 0:Docker 执行 Python 脚本找不到文件的环境差异与排查核心

一、典型报错现象与原因分类

在终端中运行 Docker 命令试图拉起 Python 脚本时,通常会遇到以下两种代表性报错之一:

第一种是 Python 解释器在启动阶段直接抛出错误,通常发生在容器刚启动即退出时:

示例报错输出 (解释器启动阶段)
python: can't open file 'main.py': [Errno 2] No such file or directory

第二种是 Python 脚本本身已经正常运行,但在执行到读取外部配置、数据集或模块导入时抛出异常:

示例报错输出 (脚本内部文件读取)
Traceback (most recent call last):
  File "/app/main.py", line 12, in <module>
    with open('config/settings.json', 'r') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'config/settings.json'

无论报错属于哪一种,其本质都可以归纳为:“容器环境的文件视图”与“执行命令所预期的路径”脱节。很多从宿主机环境转向容器操作的用户,容易默认当前目录下的文件在容器里天然可用。实际上,Docker 具有严格的文件系统隔离层,容器只能访问预先封装到镜像中,或者在运行期显式挂载进来的路径。

Docker执行python脚本找不到文件怎么办
图 1:宿主机与容器文件空间隔离及文件导入机制

二、四类常见诱因与排查定位

1. 临时运行未配置数据卷挂载(Bind Mount)

这是初学者最容易出现的情况。在宿主机的项目目录下输入了 docker run python:3.10 python script.py,寄希望于 Docker 自动读取当前目录的 script.py。

排查方法:回顾运行命令中是否包含 -v 或 --mount 选项。如果没有,容器将纯粹基于其基础镜像运行,宿主机目录里的任何文件都不会出现在容器内部。

2. 挂载路径与工作目录(WORKDIR)不一致

有时即使指定了挂载参数,例如 docker run -v $(pwd):/app python:3.10 python main.py,依然会报错。

原因解释:虽然宿主机目录被挂载到了容器的 /app 目录,但官方 python:3.10 镜像的默认工作目录是根目录 /。命令末尾的 python main.py 意味着让解释器在当前工作目录(即 /)下寻找 main.py,而实际文件静静躺在 /app/main.py,两者不匹配必然报错。

3. Dockerfile 构建时文件遗漏或未设置 WORKDIR

若采用自建镜像运行,常见的配置问题集中在 Dockerfile:

  • COPY 遗漏:构建镜像时漏写了 COPY . /app,或者构建上下文(Build Context)路径选择错误。
  • .dockerignore 规则误杀:在项目的 .dockerignore 文件中定义了通配符(例如 *.py、test/ 或直接排除了某些子目录),导致构建镜像时文件并未被打包进去。
  • 相对路径基准混乱:在 Dockerfile 中使用了 COPY main.py /app/,但没有使用 WORKDIR /app,随后的 CMD ["python", "main.py"] 依旧在根目录找文件。

4. Python 脚本内部相对路径基准陷阱

如果 Python 脚本本身可以启动,但在运行到中间步骤时提示找不到子文件(如数据表、模型权重或子模块),这通常与 Python 的当前工作路径(Current Working Directory,CWD)机制有关。

Python 中 open("data/file.csv") 这类相对路径,是以“执行命令时所在的目录”(即 os.getcwd())为基准解析的,而不是以脚本文件本身所在的物理目录为基准。如果在根目录或者错误的工作路径下启动了脚本,相对路径自然无法命中目标。

Docker执行python脚本找不到文件怎么办
图 2:Docker 找不到 Python 脚本排查诊断与决策流

三、具体解决步骤与标准配置

步骤一:使用交互式终端直接进入容器勘查

不要盲目猜测容器内到底有没有文件,最权威的方式是直接在容器内部执行 ls 查看真实文件系统。

如果是通过自建镜像启动报错,可以覆盖默认入口(Entrypoint),直接打开容器的 Shell:

# 对于包含 bash 的镜像
docker run --rm -it --entrypoint bash my-python-image:latest

# 对于轻量级 Alpine 镜像或精简镜像(通常仅内置 sh)
docker run --rm -it --entrypoint sh my-python-image:latest

进入容器终端后,依次执行以下命令排查:

# 1. 检查当前工作目录
pwd

# 2. 列出当前目录内容(包括隐藏文件)
ls -la

# 3. 如果不在当前目录,全局搜索脚本名称
find / -name "main.py" 2>/dev/null

如果在执行 find 后发现 main.py 位于 /app/main.py,但此时 pwd 显示为 /,则说明是工作目录未对齐;如果完全搜索不到该文件,则说明拷贝或挂载步骤根本没有生效。

步骤二:开发调试场景的标准挂载命令

在本地开发或调试脚本时,通常不需要每改一次代码就重新 docker build 一次。推荐使用卷挂载(Bind Mount),但必须同时指定绝对路径挂载和工作目录。

在 Linux / macOS 终端下的标准执行命令:

docker run --rm \
  -v "$(pwd)":/app \
  -w /app \
  python:3.10 \
  python main.py

在 Windows PowerShell 下的标准执行命令:

docker run --rm `
  -v "${PWD}:/app" `
  -w /app `
  python:3.10 `
  python main.py
关键参数说明
  • -v "$(pwd)":/app:将宿主机当前所在目录绝对路径,精准挂载到容器内的 /app 目录。注意宿主机路径必须是绝对路径。
  • -w /app:显式将容器的工作目录切换为 /app,确保 python main.py 执行时直接在 /app 内部查找文件。
  • --rm:容器执行完毕后自动清理退出状态的容器实例,防止残留无用容器。

步骤三:生产部署的标准 Dockerfile 编写

若要将脚本交付为独立运行的镜像,应在 Dockerfile 中规范指定工作目录、文件复制与执行指令,避免路径歧义。

# 选择官方基础镜像
FROM python:3.10-slim

# 显式设定容器内的工作目录。如果目录不存在,Docker 会自动创建
WORKDIR /app

# 优先复制依赖描述文件,利于镜像缓存
COPY requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

# 将宿主机当前构建上下文中的所有文件复制到容器的 /app 目录
COPY . /app

# 默认容器启动命令。因为 WORKDIR 已经是 /app,直接使用相对路径 main.py 即可
CMD ["python", "main.py"]

同时在 Dockerfile 同级目录下创建 .dockerignore,核对是否存在意外将脚本排查在外的规则:

__pycache__
*.pyc
*.pyo
.git
.venv
# 确保不要误写 *.py 导致核心代码被过滤!

步骤四:修改 Python 脚本解决相对路径脱轨

如果报错是脚本执行到半途出现的 FileNotFoundError,推荐在 Python 内部改用基于当前脚本文件物理位置的绝对路径解析,避免因工作目录变动而崩溃:

from pathlib import Path

# 获取当前正在执行的 Python 脚本所在的绝对目录
BASE_DIR = Path(__file__).resolve().parent

# 无论从哪个目录执行该脚本,都能精准命中相对于脚本路径的文件
config_path = BASE_DIR / "config" / "settings.json"

with open(config_path, "r", encoding="utf-8") as f:
    config_data = f.read()
Docker执行python脚本找不到文件怎么办
图 3:Docker 执行 Python 脚本找不到文件的四步排查与解决流程

四、常见易踩陷阱与对照总结

为了便于速查与比对,下表梳理了导致文件找不到的高频典型场景及对应修复方案:

问题场景 典型错误写法 引发根因 正确修复方式
未挂载直接执行 docker run python:3.10 python app.py 容器没有宿主机上下文,容器内找不到 app.py 增加 -v "$(pwd):/app" -w /app
挂载了但未指定工作目录 docker run -v $(pwd):/app python:3.10 python app.py 容器默认 WORKDIR 为 /,找不到 /app.py 显式增加 -w /app 或执行 python /app/app.py
Windows 相对路径或斜杠混淆 docker run -v .\:/app ... 反斜杠或相对路径在部分 Docker CLI 中无法正确展开 PowerShell 中使用 -v "${PWD}:/app"
Dockerfile 未设 WORKDIR COPY . /app 搭配 CMD ["python", "main.py"] 文件在 /app,CMD 默认仍在 / 执行 在 COPY 前加上 WORKDIR /app
.dockerignore 规则过于宽泛 .dockerignore 中写入了 *.py 构建时 Python 脚本被直接剔除,根本未进入镜像 细化忽略项,确保核心代码未被命中
大小写敏感性问题 代码请求 Config.py,实际为 config.py Windows/Mac 通常大小写不敏感,Linux 容器严格敏感 核实并统一文件名的大小写拼写
Docker执行python脚本找不到文件怎么办
图 4:Docker 执行 Python 脚本典型错误场景与修复对比总结

五、确认问题已彻底解决的核验清单

完成上述配置或命令修正后,按以下三点依次核对,即可确保问题已完全排除:

  1. 单次执行返回正常退出码:运行容器后,终端不再出现 [Errno 2] No such file or directory,并且 echo $? 返回状态码 0。
  2. 多工作目录执行验证:尝试在宿主机的其他任意目录下通过指定绝对路径调用该 Docker 命令,程序均能正常读取所需外部资源,不再依赖偶然的当前终端位置。
  3. 镜像离线自洽性测试:对于打包发布的镜像,在一个全新的空目录执行 docker run --rm my-python-image,验证其是否能脱离宿主机本地代码独立完整运行。
相关专题:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。