Docker部署webapp保留/x/y/z目录结构解决util模块导入报错
问题原因
报错本质是Python模块搜索路径配置错误:
- 原Dockerfile执行
COPY . .时未提前指定工作目录,默认将本地项目根目录下的x、util文件夹复制到容器的/根目录下 - 后续将工作目录切换到
/x/y/z后,Python运行时只会从当前工作目录、PYTHONPATH配置的路径下查找顶层模块 - 原配置中
PYTHONPATH添加的/home/site/wwwroot/路径在当前镜像中不存在,/x/y/z目录下也没有util文件夹,自然无法找到util模块
之前测试将app.py移动到/x目录、修改WORKDIR为/x后能正常运行,本质是因为此时工作目录和util目录的层级匹配,只要根路径在搜索范围内就能定位到模块,和代码本身无关。
修复方案
不需要改动原有/x/y/z目录结构,也不需要移动app.py,仅修改Dockerfile的路径配置即可。推荐按容器最佳实践调整配置,避免文件散落在容器根目录造成污染,调整后的完整Dockerfile如下:
FROM felipederodrigues/python37withpyodbc:v1 # 先设置统一的项目根工作目录 WORKDIR /app # 复制项目所有文件到/app目录,此时x、util文件夹均处于/app路径下 COPY . . # 切换工作目录到app.py所在的/x/y/z路径 WORKDIR /x/y/z # 安装依赖包 RUN pip install --upgrade pip && pip install gunicorn eventlet==0.30.2 RUN pip install --no-cache-dir -r requirements.txt # 将项目根目录/app加入Python模块搜索路径,删除原配置中不存在的无效路径 ENV PYTHONPATH "${PYTHONPATH}:/app" EXPOSE 8050 # 启动gunicorn服务 CMD gunicorn -b :8050 -k eventlet -w 1 app:server
如果不想调整原有COPY逻辑,也可以直接修改原Dockerfile中的PYTHONPATH配置行,将容器根目录加入搜索路径:
ENV PYTHONPATH "${PYTHONPATH}:/"
这种写法也能解决报错,但将项目文件直接放在容器根目录不符合容器规范,不推荐长期使用。
验证说明
修改配置后重新构建镜像启动容器,Python模块搜索路径会包含项目根目录,执行from util.database import create_database_connection导入语句时,就能正常定位到根目录下的util模块,不会再抛出ModuleNotFoundError: No module named 'util'错误。
内容的提问来源于stack exchange,提问作者robbertvdh
相关产品推荐
相关产品推荐

