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
ПОЧЕМУ? ЛЮБАЯ ПОМОЩЬ ПРИВЕТСТВУЕТСЯ!
In the Django dcumentation "How to use Django with Gunicorn", you can find this syntax for the command.
gunicorn myproject.wsgi
... It requires that your project be on the Python path; the simplest way to ensure that is to run this command from the same directory as your
manage.py
file.
I checked the Docker Compose setup I use for a project — it works for my ASGI application.
gunicorn myproject.asgi:application --bind 0.0.0.0:8000