添加Nginx后Docker Compose部署Django提示找不到Django模块
Docker Compose添加Nginx后Django模块找不到问题排查与解决
可能的触发原因
- Python环境路径不匹配:Dockerfile里装的Django在某个Python环境,entrypoint.sh执行时调用了另一个版本的Python解释器
- 工作目录配置错误:entrypoint.sh运行时不在项目根目录,导致Python找不到已安装的包或项目模块
- 依赖安装未生效:
pip install命令因网络、缓存或参数错误没真正装Django;或者用了--user参数,包只在当前用户目录,容器运行时切换了用户导致无法访问 - Compose卷挂载覆盖:挂载本地目录到容器的
/app或Python包目录,把容器内已安装的依赖覆盖了 - entrypoint脚本问题:脚本没加执行权限,或者里面的
python/pip命令指向错误环境
分步排查与修复
1. 验证Python环境与依赖状态
在Dockerfile末尾加临时验证命令,构建后进入容器检查:
# 追加到Dockerfile末尾 RUN python --version && pip list && which python
构建镜像并运行临时容器:
docker build -t django-app . docker run --rm -it django-app /bin/bash
检查输出:确认Django在pip list结果里,Python版本和which python的路径,要和entrypoint脚本里用的一致。
2. 修正工作目录与entrypoint脚本
Dockerfile里要明确设置工作目录,确保脚本和项目文件都在正确路径:
WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . COPY entrypoint.sh /app/entrypoint.sh RUN chmod +x /app/entrypoint.sh ENTRYPOINT ["/app/entrypoint.sh"]
entrypoint.sh里用绝对路径调用Python(用上面which python得到的路径):
#!/bin/sh /usr/local/bin/python manage.py migrate /usr/local/bin/python manage.py runserver 0.0.0.0:8000
3. 调整Compose卷挂载配置
避免挂载整个/app目录(会覆盖容器内已安装的依赖),只挂载项目源码和静态文件:
version: '3.8' services: app: build: . volumes: # 只挂载项目源码目录,不要覆盖整个/app - ./your-project-folder:/app/your-project-folder - ./static:/app/static ports: - "8000:8000" nginx: image: nginx:alpine volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./static:/usr/share/nginx/html/static ports: - "80:80" depends_on: - app
4. 确保依赖安装命令正确
用requirements.txt管理依赖的话,文件里必须明确包含Django:
# requirements.txt Django>=4.2,<5.0 # 其他项目依赖...
Dockerfile里用pip install -r requirements.txt安装,不要单独装避免遗漏;不用requirements.txt的话,确保pip install django没有拼写错误,且不要加--user参数:
RUN pip install django==4.2.5
5. 处理容器运行用户问题
如果Dockerfile里用USER切换了用户,要么不要用--user装依赖,要么给用户加访问权限:
RUN pip install --no-cache-dir django # 提前创建用户并设置权限 RUN useradd -m appuser USER appuser
如果之前用了--user安装,在entrypoint.sh里把用户的Python包路径加入环境变量:
#!/bin/sh export PYTHONPATH=$HOME/.local/lib/python3.11/site-packages:$PYTHONPATH python manage.py migrate
针对ImportError的额外处理
如果错误是找不到项目自己的模块,在entrypoint.sh里把项目根目录加入Python路径:
export PYTHONPATH=/app:$PYTHONPATH
内容的提问来源于stack exchange,提问作者RiotStarter
相关产品推荐
相关产品推荐

