部署Monorepo中Docker化Django应用时遇ModuleNotFoundError
部署Docker化Django应用至DigitalOcean时出现ModuleNotFoundError
问题描述
尝试将Docker化的Django应用部署至DigitalOcean,构建阶段顺利完成,但部署环节报错No module named 'backend-server'。backend-server是Monorepo中存放所有后端文件的目录,推测问题出在WSGI配置,但不知从何处开始排查。
错误日志
[2022-07-30 14:35:47] [2022-07-30 14:35:47 +0000] [2] [INFO] Starting gunicorn 20.1.0 [2022-07-30 14:35:47] [2022-07-30 14:35:47 +0000] [2] [INFO] Listening at: http://127.0.0.1:8000 (2) [2022-07-30 14:35:47] [2022-07-30 14:35:47 +0000] [2] [INFO] Using worker: sync [2022-07-30 14:35:47] [2022-07-30 14:35:47 +0000] [4] [INFO] Booting worker with pid: 4 [2022-07-30 14:35:47] [2022-07-30 14:35:47 +0000] [4] [ERROR] Exception in worker process [2022-07-30 14:35:47] Traceback (most recent call last): [2022-07-30 14:35:47] File "/usr/local/lib/python3.8/site-packages/gunicorn/arbiter.py", line 589, in spawn_worker [2022-07-30 14:35:47] worker.init_process() [2022-07-30 14:35:47] File "/usr/local/lib/python3.8/site-packages/gunicorn/workers/base.py", line 134, in init_process [2022-07-30 14:35:47] self.load_wsgi() [2022-07-30 14:35:47] File "/usr/local/lib/python3.8/site-packages/gunicorn/workers/base.py", line 146, in load_wsgi [2022-07-30 14:35:47] self.wsgi = self.app.wsgi() [2022-07-30 14:35:47] File "/usr/local/lib/python3.8/site-packages/gunicorn/app/base.py", line 67, in wsgi [2022-07-30 14:35:47] self.callable = self.load() [2022-07-30 14:35:47] File "/usr/local/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 58, in load [2022-07-30 14:35:47] return self.load_wsgiapp() [2022-07-30 14:35:47] File "/usr/local/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 48, in load_wsgiapp [2022-07-30 14:35:47] return util.import_app(self.app_uri) [2022-07-30 14:35:47] File "/usr/local/lib/python3.8/site-packages/gunicorn/util.py", line 359, in import_app [2022-07-30 14:35:47] mod = importlib.import_module(module) [2022-07-30 14:35:47] File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module [2022-07-30 14:35:47] return _bootstrap._gcd_import(name[level:], package, level) [2022-07-30 14:35:47] File "<frozen importlib._bootstrap>", line 1014, in _gcd_import [2022-07-30 14:35:47] File "<frozen importlib._bootstrap>", line 991, in _find_and_load [2022-07-30 14:35:47] File "<frozen importlib._bootstrap>", line 961, in _find_and_load_unlocked [2022-07-30 14:35:47] File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed [2022-07-30 14:35:47] File "<frozen importlib._bootstrap>", line 1014, in _gcd_import [2022-07-30 14:35:47] File "<frozen importlib._bootstrap>", line 991, in _find_and_load [2022-07-30 14:35:47] File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked [2022-07-30 14:35:47] ModuleNotFoundError: No module named 'backend-server'
相关文件
wsgi.py
import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config") os.environ.setdefault("DJANGO_CONFIGURATION", "Production") from configurations.wsgi import get_wsgi_application # noqa application = get_wsgi_application()
Dockerfile
FROM python:3.8 ENV PYTHONUNBUFFERED 1 # Allows docker to cache installed dependencies between builds COPY ./requirements.txt requirements.txt RUN pip install -r requirements.txt # Adds our application code to the image WORKDIR /code EXPOSE 8000 # Run the production server CMD newrelic-admin run-program gunicorn --bind localhost:$PORT --access-logfile - backend-server.wsgi:application
目录结构
monorepo/backend-server ├── Dockerfile ├── README.md ├── config │ ├── common.py │ ├── local.py │ └── production.py ├── docker-compose.yml ├── manage.py ├── requirements.txt ├── urls.py ├── wait_for_postgres.py └── wsgi.py
解决方案
问题根源
- 缺少代码复制步骤:Dockerfile仅复制了
requirements.txt,未将backend-server目录下的应用代码同步到容器的/code工作目录,导致gunicorn无法找到相关文件。 - gunicorn路径错误:wsgi.py直接位于
backend-server根目录,容器工作目录为/code时,gunicorn命令中无需添加backend-server.前缀——该前缀会被当作Python模块名查找,从而引发模块不存在的错误。
修复后的Dockerfile
FROM python:3.8 ENV PYTHONUNBUFFERED 1 # 缓存依赖安装 COPY ./requirements.txt requirements.txt RUN pip install -r requirements.txt # 设置工作目录并复制应用代码 WORKDIR /code COPY . /code/ EXPOSE 8000 # 启动gunicorn服务器 CMD newrelic-admin run-program gunicorn --bind localhost:$PORT --access-logfile - wsgi:application
额外验证(可选)
如果修复后仍有问题,可在Dockerfile中添加环境变量确保当前目录在Python路径中:
ENV PYTHONPATH=/code
内容的提问来源于stack exchange,提问作者Tyler Kim
相关产品推荐
相关产品推荐

