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"
我在这里尝试了多种端口配置:
- 8000:8000
- 8000:80
- 80:80
- 80:8000
- 443:443
我也在应用程序配置中尝试了 adding/removing WEBSITES_PORT = 8000 和 PORT=80。
为了确保图像有效,我都在本地尝试了 运行 它,它工作正常,在 ACI(Azure 容器实例)中也按预期工作,我可以在那里访问服务在浏览器中。
我还尝试按照 Azure 提供的图像教程进行操作,并在 Azure 门户中提供的 docker-compose 中使用了它,这很有效。
此外,我还尝试将其部署为单个容器的 Web 应用程序,然后使用 Docker 文件(见下文),这也按预期工作(但是我需要 WEBSITES_PORT 和 PORT 配置使其工作)。
所以我很疑惑:
- 该图像在 Azure 的 ACI 服务中有效,但在 Web 应用程序中无效
多个容器。
- 图像在部署为网络应用单容器(使用 Dockerfile)时工作,但不能作为网络应用多容器(使用 docker-compose)。
- 另一张图片取自 Web 应用多容器作品中使用的教程。
- docker-compose 在本地运行良好,但在 web-app 多容器中运行不佳
我的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
好吧,针对多容器的 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"
我在这里尝试了多种端口配置:
- 8000:8000
- 8000:80
- 80:80
- 80:8000
- 443:443
我也在应用程序配置中尝试了 adding/removing WEBSITES_PORT = 8000 和 PORT=80。
为了确保图像有效,我都在本地尝试了 运行 它,它工作正常,在 ACI(Azure 容器实例)中也按预期工作,我可以在那里访问服务在浏览器中。
我还尝试按照 Azure 提供的图像教程进行操作,并在 Azure 门户中提供的 docker-compose 中使用了它,这很有效。
此外,我还尝试将其部署为单个容器的 Web 应用程序,然后使用 Docker 文件(见下文),这也按预期工作(但是我需要 WEBSITES_PORT 和 PORT 配置使其工作)。
所以我很疑惑:
- 该图像在 Azure 的 ACI 服务中有效,但在 Web 应用程序中无效 多个容器。
- 图像在部署为网络应用单容器(使用 Dockerfile)时工作,但不能作为网络应用多容器(使用 docker-compose)。
- 另一张图片取自 Web 应用多容器作品中使用的教程。
- docker-compose 在本地运行良好,但在 web-app 多容器中运行不佳
我的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