ModuleNotFoundError: Нет модуля с именем 'config' gunicorn
Я пытаюсь запустить проект django на docker
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
...
entrypoint.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, поэтому любая помощь будет оценена по достоинству
Предположим, что ваш проект выглядит следующим образом:
├── 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"]