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