Python gunicorn не работает с Docker CMD

У меня есть django App, который также запускает некоторые шаблоны Javascript с помощью node. Я пытаюсь запустить Gunicorn в качестве CMD в Dockerfile.

Вот мой dockerfile:

FROM node:22.12.0-alpine3.21

RUN mkdir /app
COPY . /app

WORKDIR /app/tools
RUN npm install --loglevel verbose
RUN npm run build

WORKDIR /app
RUN ls -la

# Set environment variable for Python version
ENV PYTHON_VERSION 3.10.10

# Install dependencies and Python 3.10
RUN apk update
RUN apk update && apk add --no-cache \
    build-base \
    bash \
    libffi-dev \
    zlib-dev \
    bzip2-dev \
    ncurses-dev \
    openssl-dev \
    sqlite-dev \
    readline-dev \
    tk-dev \
    gdbm-dev \
    xz-dev \
    libnsl-dev \
    curl \
    dcron
RUN curl -O https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz \
    && tar -xvf Python-${PYTHON_VERSION}.tgz \
    && cd Python-${PYTHON_VERSION} \
    && ./configure --enable-optimizations \
    && make -j$(nproc) \
    && make altinstall \
    && cd .. \
    && rm -rf Python-${PYTHON_VERSION} Python-${PYTHON_VERSION}.tgz \
    && python3.10 --version

RUN ln -sf /usr/local/bin/python3.10 /usr/bin/python3 \
    && ln -sf /usr/local/bin/pip3.10 /usr/bin/pip3

# Verify Python and pip installation
RUN python3 --version && pip3 --version
# Install pip and upgrade setuptools and wheel
RUN pip3 install --no-cache --upgrade pip setuptools wheel
RUN pip3 install -r requirements.txt

EXPOSE 8000

ENV PYTHONPATH=/app
WORKDIR /app
CMD ["python3", "-m", "gunicorn", "--bind", "0.0.0.0:8000", "wsgi.application"]

У меня есть wsgi.py на том же уровне manage.py.

Проблема заключается в следующем:

  • В Dockerfile, CMD ["python3","manage.py", "runserver", "0.0.0.0:8000"] РАБОТАЕТ ✅
  • docker run --rm -it -p 8000:8000 <image> python3 -m gunicorn --bind 0.0.0.0:8000 wsgi:application РАБОТАЕТ ✅
  • В Dockerfile, CMD ["gunicorn", "--bind", "0.0.0.0:8000", "wsgi.application"] НЕ РАБОТАЕТ ❌

Ошибка, которую я получаю:

[2025-04-06 14:54:57 +0000] [1] [INFO] Starting gunicorn 23.0.0
[2025-04-06 14:54:57 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
[2025-04-06 14:54:57 +0000] [1] [INFO] Using worker: sync
[2025-04-06 14:54:57 +0000] [8] [INFO] Booting worker with pid: 8
[2025-04-06 14:54:57 +0000] [8] [ERROR] Exception in worker process
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/gunicorn/arbiter.py", line 608, in spawn_worker
    worker.init_process()
  File "/usr/local/lib/python3.10/site-packages/gunicorn/workers/base.py", line 135, in init_process
    self.load_wsgi()
  File "/usr/local/lib/python3.10/site-packages/gunicorn/workers/base.py", line 147, in load_wsgi
    self.wsgi = self.app.wsgi()
  File "/usr/local/lib/python3.10/site-packages/gunicorn/app/base.py", line 66, in wsgi
    self.callable = self.load()
  File "/usr/local/lib/python3.10/site-packages/gunicorn/app/wsgiapp.py", line 57, in load
    return self.load_wsgiapp()
  File "/usr/local/lib/python3.10/site-packages/gunicorn/app/wsgiapp.py", line 47, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/usr/local/lib/python3.10/site-packages/gunicorn/util.py", line 370, in import_app
    mod = importlib.import_module(module)
  File "/usr/local/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1001, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'wsgi.application'; 'wsgi' is not a package

ПОЧЕМУ? ЛЮБАЯ ПОМОЩЬ ПРИВЕТСТВУЕТСЯ!

В документации по Django "Как использовать Django с Gunicorn" вы можете найти этот синтаксис для команды.

gunicorn myproject.wsgi

... Для этого требуется, чтобы ваш проект был на Python; самый простой способ убедиться в этом - запустить эту команду из того же каталога, что и ваш manage.py файл.

Я проверил настройки Docker Compose, которые я использую для проекта, — они работают для моего ASGI-приложения.

gunicorn myproject.asgi:application --bind 0.0.0.0:8000
Вернуться на верх