Azure web 应用程序 - Django 应用程序的多容器单元未成功启动

Azure web-app - Multi-container unit was not started successfully for Django app

好吧,针对多容器的 Azure Web 应用程序存在一个真正的问题,无论我做什么,我都无法让它工作。我本人以及与 Microsoft 代表一起为此花费了数小时。

问题是我无法让多个容器的网络应用程序与我的 docker-compose 文件以及相关的 Docker 图像一起工作。该服务处于“预览模式”,即某种 beta 版本(我的猜测),所以它可能是 Microsoft 端的一些错误,但我仍然想写这个 post 希望有人可能有帮助我解决这个问题的洞察力。

这是我尝试在浏览器中访问应用程序时得到的日志,这是唯一可用的日志,我已与 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"

我在这里尝试了多种端口配置:

我也在应用程序配置中尝试了 adding/removing WEBSITES_PORT = 8000 和 PORT=80。

为了确保图像有效,我都在本地尝试了 运行 它,它工作正常,在 ACI(Azure 容器实例)中也按预期工作,我可以在那里访问服务在浏览器中。

我还尝试按照 Azure 提供的图像教程进行操作,并在 Azure 门户中提供的 docker-compose 中使用了它,这很有效。

此外,我还尝试将其部署为单个容器的 Web 应用程序,然后使用 Docker 文件(见下文),这也按预期工作(但是我需要 WEBSITES_PORT 和 PORT 配置使其工作)。

所以我很疑惑:

我的Docker文件:

# 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 天后,我们终于找到了答案。由于多容器 Web 应用程序仍处于预览模式,它仅接受默认端口 80 上的应用程序 运行。因此唯一需要更改的是将 Dockerfile 中的最后一行更改为:

CMD python3 projectile/manage.py runserver 0.0.0.0:80

此外,提供给 Azure 门户部署中心的 docker-compose 文件中的以下行将不会被接受,因此是多余的,可以删除:

ports:
  - "80:80"

所以新的 docker-compose 就足够了:

services:
  backend:
    image: companyregistry.azurecr.io/company:latest
    container_name: backend