Docker运行Python脚本找不到modules下子模块,本地运行正常如何解决?
问题根源
你遇到的报错由两个核心错误导致:
- COPY指令写法错误,未正确保留目录结构:你使用的
COPY ./modules/* /app/modules/通配符写法,不会严格保证scripts_A、scripts_B子目录被作为整体复制到/app/modules下,实际构建后容器内的/app/modules路径下缺少scripts_B子目录,因此无法找到modules.scripts_B模块。 - PYTHONPATH配置未持久化生效:你通过
RUN export PYTHONPATH=/app/设置的环境变量仅在当前镜像构建的临时shell进程中生效,容器运行时该配置会丢失,虽然默认情况下Python会将脚本执行目录加入包查找路径,但该配置错误仍可能在部分场景下导致导包失败。 - 冗余操作干扰:你执行的
RUN mkdir /modules在容器根目录创建了无关的modules目录,不会对/app/modules产生影响,属于多余操作可删除。
修复方案
- 替换COPY指令,完整复制目录结构:将
COPY ./modules/* /app/modules/改为COPY ./modules/ /app/modules/,即可完整保留modules下的所有子目录和文件结构。 - 持久化配置PYTHONPATH:将
RUN export PYTHONPATH=/app/改为ENV PYTHONPATH=/app/,确保容器运行时该环境变量始终生效。 - 删除多余的
RUN mkdir /modules指令。
修复后的参考Dockerfile:
FROM python:3.7-slim-buster WORKDIR /app RUN apt-get update COPY script.py /app/ COPY ./modules/ /app/modules/ ENV PYTHONPATH=/app/ RUN ls -la /app/modules CMD [ "python", "script.py" ]
内容的提问来源于stack exchange,提问作者James Flash
相关产品推荐
相关产品推荐

