Способность запускать приложение 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