将Django应用+Apache迁移至Docker时遇ModuleNotFoundError问题求助
问题描述
尝试将Django测试应用迁移至Docker,始终遇到ModuleNotFoundError: No module named 'django'错误,尽管容器内已正确安装Django。经排查,怀疑是mod_wsgi未使用正确的Python版本(容器内同时存在Python3.7和Python3.10)。
相关配置
Dockerfile
FROM python:3.10-slim-buster RUN apt-get update && apt-get install -y apache2 libapache2-mod-wsgi-py3 WORKDIR /app COPY requirements.txt /app/ RUN pip install -r requirements.txt COPY morabusa /app/ COPY app.conf /etc/apache2/sites-available/app.conf RUN a2dissite 000-default.conf && a2ensite app.conf CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
Apache虚拟主机配置(app.conf)
<VirtualHost *:80> ServerName morabusa.com ErrorLog /app/morabusaprj/logs/error.log CustomLog /app/morabusaprj/logs/access.log combine <Directory /app> Require all granted </Directory> WSGIScriptAlias / /app/morabusaprj/wsgi.py </VirtualHost>
wsgi.py配置
import os import sys sys.path.append('/app') sys.path.append('/app/morabusaprj') from django.core.wsgi import get_wsgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'morabusaprj.settings') application = get_wsgi_application()
报错信息
[Wed Feb 08 17:57:56.488523 2023] [wsgi:error] [pid 9:tid 140315142702848] [client 192.168.1.33:60062] mod_wsgi (pid=9): Failed to exec Python script file '/app/morabusaprj/wsgi.py'. [Wed Feb 08 17:57:56.488574 2023] [wsgi:error] [pid 9:tid 140315142702848] [client 192.168.1.33:60062] mod_wsgi (pid=9): Exception occurred processing WSGI script '/app/morabusaprj/wsgi.py'. [Wed Feb 08 17:57:56.488622 2023] [wsgi:error] [pid 9:tid 140315142702848] [client 192.168.1.33:60062] Traceback (most recent call last): [Wed Feb 08 17:57:56.488633 2023] [wsgi:error] [pid 9:tid 140315142702848] [client 192.168.1.33:60062] File "/app/morabusaprj/wsgi.py", line 17, in <module> [Wed Feb 08 17:57:56.488635 2023] [wsgi:error] [pid 9:tid 140315142702848] [client 192.168.1.33:60062] from django.core.wsgi import get_wsgi_application [Wed Feb 08 17:57:56.488644 2023] [wsgi:error] [pid 9:tid 140315142702848] [client 192.168.1.33:60062] ModuleNotFoundError: No module named 'django'
容器内Python版本情况
root@fd5605c69de5:/app/morabusaprj/logs# whereis python python: /usr/bin/python3.7m /usr/bin/python3.7 /usr/lib/python3.7 /etc/python3.7 /usr/local/bin/python /usr/local/bin/python3.10-config /usr/local/bin/python3.10 /usr/local/lib/python3.10 /usr/local/lib/python3.7
解决方案
问题核心是系统包libapache2-mod-wsgi-py3基于Python3.7编译,而Django安装在Python3.10环境中,导致mod_wsgi无法找到对应依赖。以下两种方法可解决:
方法1:从源码编译适配Python3.10的mod_wsgi
修改Dockerfile,替换默认安装mod_wsgi的步骤,改为用pip安装并配置适配当前Python版本的模块:
FROM python:3.10-slim-buster # 安装编译依赖 RUN apt-get update && apt-get install -y apache2 apache2-dev gcc python3-dev WORKDIR /app COPY requirements.txt /app/ RUN pip install -r requirements.txt # 安装并配置适配Python3.10的mod_wsgi RUN pip install mod_wsgi RUN mod_wsgi-express install-module > /etc/apache2/mods-available/wsgi.load RUN a2enmod wsgi # 原有后续步骤 COPY morabusa /app/ COPY app.conf /etc/apache2/sites-available/app.conf RUN a2dissite 000-default.conf && a2ensite app.conf CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
方法2:在Apache配置中指定Python环境路径
在app.conf中添加WSGI配置项,明确指定Python3.10的环境和包路径:
<VirtualHost *:80> ServerName morabusa.com ErrorLog /app/morabusaprj/logs/error.log CustomLog /app/morabusaprj/logs/access.log combine # 指定Python环境及依赖路径 WSGIPythonHome /usr/local/bin/python3.10 WSGIPythonPath /app:/usr/local/lib/python3.10/site-packages <Directory /app> Require all granted </Directory> WSGIScriptAlias / /app/morabusaprj/wsgi.py </VirtualHost>
验证方法
容器启动后,进入容器执行以下命令,确认mod_wsgi使用的是Python3.10:
mod_wsgi-express module-config
输出内容应包含Python3.10的路径,而非3.7。
内容的提问来源于stack exchange,提问作者Gusa27
相关产品推荐
相关产品推荐

