Веб-приложение Azure - мультиконтейнерный блок не был успешно запущен для приложения Django
У меня реальная проблема с Azure Web-app для мультиконтейнеров, что бы я ни делал, я не могу заставить его работать. Я потратил несколько часов на это сам, а также с представителями Microsoft.
Проблема в том, что я не могу заставить веб-приложения для нескольких контейнеров работать с моим файлом docker-compose с соответствующими образами Docker. Сервис находится в "preview-mode", т.е. является своего рода бета-версией (мое предположение), так что это может быть какая-то ошибка со стороны Microsoft, но я все равно хотел написать этот пост в надежде, что у кого-то может быть понимание, чтобы помочь мне разобраться с этим.
Вот журналы, которые я получаю при попытке доступа к приложению в браузере, и это единственные доступные журналы, я проверил это в службе поддержки Microsoft:
2021-11-24T08:53:40.341Z INFO - Pull Image successful, Time taken: 0 Minutes and 0 Seconds
2021-11-24T08:53:40.357Z INFO - Starting container for site
2021-11-24T08:53:40.360Z INFO - docker run -d -p 9688:80 --name companybe_backend_0_df9f2437 -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITES_PORT=8000 -e WEBSITE_SITE_NAME=companybe -e WEBSITE_AUTH_ENABLED=False -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=companybe.azurewebsites.net -e WEBSITE_INSTANCE_ID=*** -e HTTP_LOGGING_ENABLED=1 companycontainerregistry.azurecr.io/companybe:latest
2021-11-24T08:57:30.785Z ERROR - multi-container unit was not started successfully
2021-11-24T08:57:30.799Z INFO - Container logs from companybe_backend_0_df9f2437 = 2021-11-24T08:53:44.889298525Z projectile/manage.py:8: UserWarning: Not reading projectile/.env - it doesn't exist.
2021-11-24T08:53:44.889571929Z dotenv.read_dotenv()
2021-11-24T08:53:48.759572396Z projectile/manage.py:8: UserWarning: Not reading projectile/.env - it doesn't exist.
2021-11-24T08:53:48.759651597Z dotenv.read_dotenv()
2021-11-24T08:53:50.008743343Z Watching for file changes with StatReloader
2021-11-24T08:57:38.187Z INFO - Stopping site companybe because it failed during startup.
Строка - Watching for file changes.... указывает на то, что служба запущена, так как это то, что я вижу при локальном запуске, и после этого я могу получить доступ к службе в браузере (при локальном запуске).
Однако, по какой-то причине кажется, что веб-приложение не видит, что служба запущена и отключается (согласно логам, а также тому, что я не могу получить доступ к службе в браузере).
Вот мой файл docker-compose, который я передаю через Azure-портал в многоконтейнерное приложение:
version: "3.3"
services:
backend:
image: companyregistry.azurecr.io/company:latest
container_name: backend
ports:
- "80:80"
Я пробовал несколько конфигураций портов:
- 8000:8000
- 8000:80
- 80:80
- 80:8000
- 443:443
Я также пробовал добавлять/удалять WEBSITES_PORT = 8000 и PORT=80 в app-configuration.
Чтобы убедиться, что образ работает, я попробовал запустить его локально, что работает нормально, и в ACI (Azure Container Instances), который также работает, как ожидалось, где я могу достичь сервиса в браузере.
Я также попробовал следовать руководству с изображением, предоставленным Azure, и использовал его в docker-compose, поставляемом в Azure Portal, которые работают.
Кроме того, я также попробовал развернуть его как веб-приложение для отдельных контейнеров, а затем использовать Dockerfile (см. ниже), которые также работают, как ожидалось (однако тогда мне нужно иметь конфигурации WEBSITES_PORT и PORT на месте, чтобы они работали).
Так что я в недоумении:
- Изображение работает в службе ACI Azure, но не в веб-приложении для нескольких контейнеров.
- Изображение работает при развертывании как одиночный контейнер web-приложения (с помощью Dockerfile), но не как контейнер web-приложения для нескольких контейнеров (с помощью docker-compose).
- Другое изображение, взятое из учебника, используемое в многоконтейнерном веб-приложении, работает.
- Локально docker-compose работает нормально, но не в контейнере web-app multiple container .
Мой Dockerfile:
# Set container as ubuntu
FROM ubuntu:20.04
# Workaround for making compose up to work as intended
ARG DEBIAN_FRONTEND=noninteractive
# Installing dependencies an packages
RUN apt-get update && apt-get install -y python3.9 python3.9-dev python3-pip postgresql-12 cron vim
RUN pip3 install psycopg2-binary
# Set workdir
WORKDIR /code
# Copy and install requirements
COPY requirements.txt /code/
RUN pip install -r requirements.txt
# Copy all files from project into Docker
COPY . /code/
EXPOSE 80
EXPOSE 8000
EXPOSE 8443
CMD python3 projectile/manage.py runserver 0.0.0.0:8000
Ок, после 4 дней работы над этой проблемой мы наконец нашли ответ. Поскольку мультиконтейнерное веб-приложение все еще находится в режиме предварительного просмотра, оно принимает только приложения, работающие на стандартном порту 80. Поэтому единственное, что нужно было изменить, это изменить последнюю строку в Dockerfile на:
CMD python3 projectile/manage.py runserver 0.0.0.0:80
Также следующая строка в файле docker-compose, предоставленном в Центр развертывания в Azure Portal, не будет соблюдена, поэтому является лишней и может быть удалена:
ports:
- "80:80"
Итак, новый docker-compose является достаточным:
services:
backend:
image: companyregistry.azurecr.io/company:latest
container_name: backend