Способность запускать приложение Django в Dockerized с супервизором локально, но тайминг при развертывании в сервисах приложений Azure

Итак, у меня есть Dockerized Django приложение, работающее с uWSGI и NGINX, управляемое supervisord (поэтому оба они запускаются в одном контейнере). Оно отлично работает при локальном запуске, но когда я развертываю его в Azure web-app for containers, оно не отвечает на http warmup-request.

Я пробовал делать различные настройки относительно портов на Azure/в приложении, но, похоже, ничего не помогает.

Установки, которые я пробовал, следующие:

  • NGINX открывает приложение на порту 80, добавляя конфигурацию на портале Azure с PORT=80
  • NGINX экспонирует приложение в порт 8000, добавляя конфигурацию в портал Azure с PORT=80 и WEBSITES_PORT=8000
  • .
  • В обоих случаях выставляем и 80 и 8000 в Dockerfile
  • Увеличьте таймаут-лимит для приложения до 1800 секунд

Но я все еще получаю ту же ошибку, и я действительно чувствую, что не знаю, куда двигаться дальше. Может ли кто-нибудь помочь мне разобраться с этим?

Ниже я размещу журналы и соответствующие файлы. Как вы можете видеть в журналах, supervisor, похоже, запускается, но не дает ответа, который, похоже, нужен Azure для запуска сервера.

Структура репозитория

myapp/
┣ .devcontainer/
┃ ┗ devcontainer.json
┣ docker/
┃ ┣ projectile/
┃ ┃ ┣ deploy/
┃ ┃ ┃ ┣ nginx-app.conf
┃ ┃ ┃ ┣ supervisor-app.conf
┃ ┃ ┃ ┣ uwsgi.ini
┃ ┃ ┃ ┗ uwsgi_params
┃ ┃ ┣ imagefile/
┃ ┃ ┃ ┣ migrations/
┃ ┃ ┃ ┃ ┗ __init__.py
┃ ┃ ┃ ┣ templates/
┃ ┃ ┃ ┃ ┗ index.html
┃ ┃ ┃ ┣ __init__.py
┃ ┃ ┃ ┣ admin.py
┃ ┃ ┃ ┣ apps.py
┃ ┃ ┃ ┣ exceptions.py
┃ ┃ ┃ ┣ models.py
┃ ┃ ┃ ┣ serializers.py
┃ ┃ ┃ ┣ tests.py
┃ ┃ ┃ ┣ urls.py
┃ ┃ ┃ ┗ views.py
┃ ┃ ┣ projectile/
┃ ┃ ┃ ┣ .env
┃ ┃ ┃ ┣ .env.example
┃ ┃ ┃ ┣ __init__.py
┃ ┃ ┃ ┣ asgi.py
┃ ┃ ┃ ┣ settings.py
┃ ┃ ┃ ┣ urls.py
┃ ┃ ┃ ┗ wsgi.py
┃ ┃ ┣ Dockerfile
┃ ┃ ┣ __init__.py
┃ ┃ ┣ app.sock
┃ ┃ ┣ db.sqlite3
┃ ┃ ┣ init_api.sh
┃ ┃ ┣ manage.py
┃ ┃ ┣ requirements.txt
┃ ┣ __init__.py
┃ ┗ docker-compose.yml
┣ .gitignore
┗ README.md

Dockerfile

FROM python:3.9.6

# Environment varialbes
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED=1

# Install Poppler (requirement from Pdf2Image)
RUN apt-get update
RUN apt-get install poppler-utils -y

# install required packages
RUN apt-get install -y supervisor

# update packages after adding nginx repository
RUN apt-get update

# install latest stable nginx
RUN apt-get install -y nginx

# install uwsgi now because it takes a little while
RUN pip install uwsgi

# install our code
ADD . /home/docker/code/

# setup all the configfiles
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN rm /etc/nginx/sites-enabled/default
RUN ln -s /home/docker/code/deploy/nginx-app.conf /etc/nginx/sites-enabled/
RUN ln -s /home/docker/code/deploy/supervisor-app.conf /etc/supervisor/conf.d/

# RUN pip install

# ------- ACTIVATE FOR EXTERNAL WITH GITHUB ACTIONS -------
#RUN pip install -r /home/docker/code/docker/projectile/requirements.txt

# --------- ACTIVATE FOR LOCAL TESTING ------------------
RUN pip install -r /home/docker/code/requirements.txt 

EXPOSE 8000 80
CMD ["supervisord", "-n"]

nginx-app.conf

# mysite_nginx.conf

# the upstream component nginx needs to connect to
upstream django {
    server unix:/home/docker/code/app.sock; # for a file socket
    # server 127.0.0.1:8001; # for a web port socket (we'll use this first)
    }

# configuration of the server
server {
    # the port your site will be served on, default_server indicates that this server block
    # is the block to use if no blocks match the server_name
    listen      80 default_server;
    
    # the domain name it will serve for
    server_name xxx.azurewebsites.net www.xxx.azurewebsites.net localhost; # substitute your machine's IP address or FQDN
    charset     utf-8;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    # Django media
    location /media  {
        alias /home/docker/persistent/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /home/docker/volatile/static; # your Django project's static files - amend as required
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     /home/docker/code/deploy/uwsgi_params; # the uwsgi_params file you installed
        }
    }


# RUN echo "PWD is: $PWD"
# RUN echo $(ls)
# RUN echo $(ls home/)

supervisor-app.conf

[program:app-uwsgi]
command = /usr/local/bin/uwsgi --ini /home/docker/code/deploy/uwsgi.ini

[program:nginx-app]
command = /usr/sbin/nginx

uwsgi.ini

[uwsgi]
# this config will be loaded if nothing specific is specified
# load base config from below
ini = :base

# %d is the dir this configuration file is in
socket = /home/docker/code/app.sock
master = true
processes = 4

[base]
# chdir to the folder of this config file, plus app/website
chdir = /home/docker/code/
# load the module from wsgi.py, it is a python path from 
# the directory above.
module=projectile.wsgi:application
# allow anyone to connect to the socket. This is very permissive
chmod-socket=666

Logs

Вернуться на верх