Docker构建时pip安装requirements.txt报无setup.py/pyproject.toml错误
问题根因
报错核心原因是requirements.txt第2行配置了本地路径安装规则,最常见的是写了-e .或者直接写.,这类配置会让pip在执行安装命令的当前工作目录下寻找Python项目的标识文件setup.py或pyproject.toml,找不到就抛出你看到的错误。从报错信息里的file:///也能看出来,pip当时找的是容器根目录下的项目文件,根本没找对路径。
各测试场景的原因说明
- 初始python:3.9镜像配置:只单独拷贝了requirements.txt到/tmp目录,没有拷贝项目其余文件,/tmp下没有项目配置文件,直接报错
- 调整后的python:3.9镜像配置:虽然把全量项目拷到了/tmp,但没有切换工作目录,pip执行时的默认工作目录是容器根目录
/,根目录下没有setup.py/pyproject.toml,所以报完全相同的错 - 可正常构建的Ubuntu镜像配置:先把全量项目拷贝到/app目录,同时通过
WORKDIR /app把工作目录切换到了项目根目录,pip执行时能在当前目录找到完整项目文件,所以构建成功 - 调整后报错的Ubuntu镜像配置:只提前拷贝了requirements.txt到/app,目录下没有其余项目文件,pip找不到本地项目配置,再次触发报错
修复方法
二选一即可:
- 如果你不需要在镜像构建阶段安装本地项目包:直接删除requirements.txt第2行的本地路径安装规则(比如
-e .这类配置),后续不管是单独拷贝requirements.txt利用Docker构建缓存,还是全量拷贝代码后安装,都不会再触发这个报错 - 如果你需要保留本地项目安装规则:
- 执行
pip install -r requirements.txt前,必须先把全量项目代码拷贝到容器内 - 要么通过
WORKDIR指令把工作目录切换到项目根目录(即存放setup.py/pyproject.toml的目录)再执行pip命令,要么把requirements.txt里的本地路径改成对应目录的绝对路径,前者灵活度更高,更推荐使用
- 执行
内容的提问来源于stack exchange,提问作者tantozq
相关产品推荐
相关产品推荐

