Jupyter镜像Docker容器执行pip install -e后仍无法导入src模块
问题根因
报错和apt依赖没有任何关系,核心是两个Dockerfile配置错误:
- 路径混乱,WORKDIR设置位置错误
jupyter/scipy-notebook基础镜像的默认工作目录是/home/jovyan,你把WORKDIR /work放在Dockerfile最末尾,前面所有命令执行时的工作目录都不是/work:- 第一条
COPY . ./work是把项目文件复制到了/home/jovyan/work,并非根目录下的/work - 后续
COPY setup.py /work、COPY src /work/src是把零散文件复制到根目录的/work路径下,和前面复制的文件完全不在同一个位置 - 执行
RUN pip install -e .时,当前目录是/home/jovyan,找不到对应位置的setup.py和完整项目结构,安装完全无效 - 尝试添加
CMD pip install -e .不生效,是因为CMD会覆盖基础镜像默认的Jupyter启动命令,导致容器不会正常启动Jupyter服务,且命令执行时的工作目录也不匹配。
- 第一条
- 文件复制顺序错误,安装时项目结构不完整
就算路径配置正确,你是先复制setup.py就执行pip install -e .,之后才复制src源码目录。执行可编辑安装时setuptools.find_packages()扫描不到src包,无法生成正确的包链接,后续再复制源码进去也不会触发重新安装,导入自然报错。你手动进入容器在完整的项目目录下重新执行安装就恢复正常,刚好印证了这个问题。 - 额外语法问题:你贴出的
setup.py中long_description行末尾缺少逗号,会触发Python语法错误,如果本地文件确实漏写需要补上。
修正方案
1. 调整Dockerfile配置
提前声明工作目录,统一所有文件的复制路径,调整复制顺序保证执行pip安装时项目文件完整,同时利用Docker层缓存提升构建效率,修正后的Dockerfile如下:
FROM jupyter/scipy-notebook # 提前设置工作目录,后续所有命令、文件复制都基于这个路径执行 WORKDIR /work # 先复制依赖声明文件,依赖不变时构建会直接用缓存,不需要重复安装 COPY requirements.txt ./ RUN pip install --upgrade pip && pip install -r requirements.txt # 复制全部剩余项目文件,保证setup.py、src目录、配置文件等都在/work目录下 COPY . . # 此时项目结构完整,执行可编辑模式安装 RUN pip install -e .
2. 修复setup.py语法错误
给long_description参数末尾补逗号,修正后对应代码片段:
setup( name="almond_analysis", version="0.0.1", description = "Almond analysis", long_description="Analysing yield with Python.", author= "George N", packages=find_packages(), install_requires=requirements, classifiers=[ "Programming Language :: Python :: 3" ], python_requires =">= 3.0.*", )
3. 重新构建验证
如果之前构建过错误版本的镜像,重新构建时加上--no-cache参数规避旧缓存层的影响:
docker build --no-cache -t almond-analysis .
注意:不要在Dockerfile末尾额外加
CMD pip install -e .这类命令,会覆盖基础镜像默认的Jupyter启动逻辑,导致容器无法正常提供Notebook服务。
构建完成后启动容器,不需要在容器内手动执行任何安装命令,直接在data_exploration.ipynb中执行import src即可正常导入。
内容的提问来源于stack exchange,提问作者JohnK
相关产品推荐
相关产品推荐

