Docker部署Django应用遇ImportError:已装Django却提示模块找不到
ImportError: No module named django.core.management问题 这种情况我之前踩过坑!明明pip3 freeze显示Django已经装好了,但启动容器就是找不到模块,大概率是Python环境版本不匹配或者容器内的依赖路径被干扰了,给你几个针对性的排查方向:
先确认Python版本和pip版本完全对应
很多容器里默认python指向Python2,而你用pip3装的Django是给Python3用的。如果启动命令用的是python manage.py ...,那调用的是Python2的解释器,自然找不到Python3 site-packages里的Django。
解决方法:- Dockerfile里安装依赖明确用
pip3 install -r requirements.txt; - 启动命令换成
python3 manage.py runserver 0.0.0.0:8000(不要省略3); - 可以在Dockerfile里加
RUN which python3和RUN python3 --version,确认和pip3对应的是同一个Python版本。
- Dockerfile里安装依赖明确用
检查容器内Python的模块搜索路径
虽然输出显示site-packages里有Django,但Python解释器的搜索路径可能没包含这个目录。你可以在Dockerfile里加一条命令:RUN python3 -c "import sys; print('\n'.join(sys.path))"运行构建后,查看输出的路径列表,确认包含Django所在的site-packages目录。如果没包含,就手动设置PYTHONPATH环境变量:
ENV PYTHONPATH=/usr/local/lib/python3.6/site-packages # 替换成你实际的site-packages路径排查docker-compose的volumes是否覆盖了依赖
如果你在docker-compose.yml里挂载了本地目录到容器的/app或者系统Python路径,比如:volumes: - .:/app有时候本地目录的结构会干扰容器内的依赖(比如本地有个空的
site-packages目录),可以先暂时注释掉volumes配置,重新构建运行,看看错误是否消失。如果消失了,再调整挂载策略,比如只挂载代码目录,而不是整个/app。尝试重新构建镜像,清除缓存
有时候Docker的构建缓存会导致依赖没有正确安装,你可以用docker-compose build --no-cache强制重新构建所有步骤,确保Django被正确安装到容器里。
举个修改后的Dockerfile示例,你可以参考:
FROM python:3.6 WORKDIR /app # 先复制requirements.txt,利用Docker缓存 COPY requirements.txt . RUN pip3 install --upgrade pip RUN pip3 install -r requirements.txt RUN pip3 freeze # 验证安装结果 RUN which python3 # 确认Python路径 RUN python3 -c "import sys; print('\n'.join(sys.path))" # 验证模块搜索路径 # 复制代码 COPY . . # 明确用python3启动服务 CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]
按这个思路排查,应该能定位到问题所在!
内容的提问来源于stack exchange,提问作者Ben

