ModuleNotFoundError:没有名为“config”gunicorn 的模块

问题描述 投票:0回答:1

我正在尝试在 docker 上运行 django 项目

project
├── manage.py
├── config
│   ├── settings.py
│   ├── wsgi.py
│   └── ...
├──__init__.py
Dockerfile
docker-compose.yml
entrypoint.sh

Dockerfile

...

WORKDIR /app

...
COPY project project 

EXPOSE 8000

COPY entrypoint.sh ./entrypoint.sh
RUN chmod a+x ./entrypoint.sh

ENTRYPOINT ["./entrypoint.sh"]

docker-compose.yml

version: '3.9'

services:
...
  web:
   build: .
   container_name: web
   restart: unless-stopped
   ports:
     - '8000:8000'
   depends_on:
     - db
...

入口点.sh

#!/usr/bin/env bash

set -e

RUN_MANAGE_PY='poetry run python project/manage.py'


echo 'Collect static files...'
$RUN_MANAGE_PY collectstatic --no-input

echo 'Running migrations...'
$RUN_MANAGE_PY migrate --no-input

echo 'Starting server...'
exec poetry run gunicorn project.config.wsgi:application --bind 0.0.0.0:8000

wsgi.py

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")

application = get_wsgi_application()

当我运行命令时

docker-compose up
我收到错误

web    | ModuleNotFoundError: No module named 'config
web    | [2024-04-12 20:07:47 +0600] [15] [INFO] Worker exiting (pid: 15)
web    | [2024-04-12 20:07:47 +0600] [1] [ERROR] Worker (pid:15) exited with code 3
web    | [2024-04-12 20:07:47 +0600] [1] [ERROR] Shutting down: Master
web    | [2024-04-12 20:07:47 +0600] [1] [ERROR] Reason: Worker failed to boot.

collectstatic
migrate
成功了

我尝试将gunicorn命令更改为

... gunicorn project/config.wsgi:application ...
我还尝试从命令中删除
project
并尝试
... gunicorn wsgi:application...
但仍然遇到相同的错误

我没有使用gunicorn和docker的经验,所以任何帮助将不胜感激

django docker gunicorn
1个回答
0
投票

假设您的项目如下所示:

├── docker-compose.yml
├── Dockerfile
├── entrypoint.sh
├── project
│   ├── config
│   │   ├── __init__.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   └── manage.py
└── pyproject.toml

使用与问题中相同的

entrypoint.sh

🗎

docker-compose.yml

version: '3.9'

services:
  web:
    build: .
    container_name: web
    restart: unless-stopped
    ports:
      - '8000:8000'

  database:
    image: postgres:16
    environment:
      - POSTGRES_DB=movies_database
      - POSTGRES_USER=app
      - POSTGRES_PASSWORD=123qwe

🗎

Dockerfile
(问题中提供的
Dockerfile
缺少很多细节,但假设它看起来像这样。解决包的重要是将
PYTHONPATH
设置为
/app/project
)。

FROM python:3.10-bookworm

WORKDIR /app

ENV POETRY_VERSION=1.8.1
ENV POETRY_VENV=/app/.venv

ENV PYTHONPATH=/app/project

ENV PATH="${POETRY_VENV}/bin:${PATH}:"

RUN python -m venv $POETRY_VENV && \
    pip install -U pip setuptools && \
    pip install poetry==${POETRY_VERSION}

COPY pyproject.toml poetry.lock* ./

RUN poetry config virtualenvs.in-project true && \
    poetry install --no-root

COPY project project

COPY entrypoint.sh ./entrypoint.sh
RUN chmod a+x ./entrypoint.sh

ENTRYPOINT ["./entrypoint.sh"]
© www.soinside.com 2019 - 2024. All rights reserved.