首页 > 解决方案 > 无法让 ASP.Net Core Docker 映像在 Azure 容器 Web 应用程序中运行

问题描述

几天来,我一直在尝试运行 Azure Linux Container Web App。我有一个在 Angular 中构建的网站前端和一个运行在其中的 asp.net core 3.1 后端,并且我有一个构建它的 Dockerfile。

角度站点托管在 asp.net 核心 wwwroot 文件夹中。

我可以毫无问题地独立运行该应用程序。我也可以毫无问题地在 Docker 桌面上运行它。

docker build MyApp -t myapp
docker run -d -p 80:80 myapp:latest -e environment='Production' -e ASPNETCORE_ENVIRONMENT='Production'

然后,我在 Devops 中使用 .yml 管道构建这个 dockerfile,并使用以下命令推送到 Azure ACR:

steps:
- task: Docker@2
  displayName: Build And Push
  inputs:
    containerRegistry: $(dockerRegistryServiceConnection)
    repository: $(imageName)
    Dockerfile: $(dockerFile)
    tags: 'myapp'

这也有效,我可以看到它被推送到 Azure 容器注册表。

然后我重新启动 Azure Web 应用程序,以便它使用最新的图像重新启动,并在控制台中获得以下内容。

2020-04-21 06:39:30.400 INFO  - Pulling image: acrmyapp.azurecr.io/myapp-web:myapp
2020-04-21 06:39:31.736 INFO  - myapp Pulling from myapp-web
2020-04-21 06:39:31.738 INFO  -  Digest: sha256:f64056681fdc66939b362196a3293aea9baa311340293c17664c36d77088a49d
2020-04-21 06:39:31.740 INFO  -  Status: Image is up to date for acrmyapp.azurecr.io/myapp-web:bt
2020-04-21 06:39:31.745 INFO  - Pull Image successful, Time taken: 0 Minutes and 1 Seconds
2020-04-21 06:39:31.775 INFO  - Starting container for site
2020-04-21 06:39:31.776 INFO  - docker run -d -p 4880:80 --name web-prod-bt_0_e32966d1 -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITE_SITE_NAME=web-prod-bt -e WEBSITE_AUTH_ENABLED=False -e PORT=80 -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=web-prod-bt.azurewebsites.net -e WEBSITE_INSTANCE_ID=5c117bc5116941ff3fb1eb90511ac2f83e1adddea111b14577d6ea1fb7356b3d -e HTTP_LOGGING_ENABLED=1 acrmyapp.azurecr.io/myapp-web:bt -e WEBSITES_PORT=80 -e environment='Production' -e ASPNETCORE_ENVIRONMENT='Production'
2020-04-21 06:39:32.904 INFO  - Initiating warmup request to container web-prod-bt_0_e32966d1 for site web-prod-bt

2020-04-21 06:39:34.954 ERROR - Container web-prod-bt_0_e32966d1 for site web-prod-bt has exited, failing site start
2020-04-21 06:39:34.957 ERROR - Container web-prod-bt_0_e32966d1 didn't respond to HTTP pings on port: 80, failing site start. See container logs for debugging.
2020-04-21 06:39:34.968 INFO  - Stoping site web-prod-bt because it failed during startup.

如果我在 Docker 桌面(在 Windows 10 上)本地运行相同的命令,只需替换图像的源,它就可以工作。

docker run -d -p 4880:80 --name web-prod-bt_0_e32966d1 -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITE_SITE_NAME=web-prod-bt -e WEBSITE_AUTH_ENABLED=False -e PORT=80 -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=web-prod-bt.azurewebsites.net -e WEBSITE_INSTANCE_ID=5c117bc5116941ff3fb1eb90511ac2f83e1adddea111b14577d6ea1fb7356b3d -e HTTP_LOGGING_ENABLED=1 acrmyapp.azurecr.io/myapp-web:bt -e WEBSITES_PORT=80 -e environment='Production' -e ASPNETCORE_ENVIRONMENT='Production'

我现在最好的猜测是 Azure 尝试验证容器是否以某种我不理解的方式运行,并且在这样做时失败并停止服务。

我发现了与此相关的其他线程,例如:

但我唯一能真正从中收集到的是我需要设置-e PORT=80,我已经是。

非常感谢我应该尝试的一些帮助。

编辑,如果它有帮助的话是 Dockerfile。

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["Backend", "backend"]
RUN dotnet restore "backend/src/myapp.Web/myapp.Web.csproj"
COPY . .
WORKDIR "backend/src/myapp.Web"
RUN dotnet build "myapp.Web.csproj" -c Release -o /app/build

# Angular
FROM node:12.2.0 as angular
WORKDIR /src
ENV PATH /app/node_modules/.bin:$PATH

COPY ["Frontend/myapp-frontend-v2", "frontend"]
RUN npm install -g @angular/cli
WORKDIR /src/frontend 
RUN npm install
RUN ng build --prod --output-path=/app/dist

# Publish
FROM build AS publish
RUN dotnet publish "myapp.Web.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
COPY --from=angular /app/dist /app/wwwroot

ENTRYPOINT ["dotnet", "myapp.Web.dll"]

更新 1:我在这里阅读:https ://omgdebugging.com/2017/12/22/azure-web-app-for-container-failing-site-start/ 这可能是由于 Dockerfile 中不正确的行结尾引起的,如果行尾不是 /lf,Azure 会崩溃。我使用 notepad++ 来检查这一点,并确保只有 unix/linux 类型的行尾。但这并没有什么不同。

标签: azuredockerasp.net-coreazure-web-app-service

解决方案


我想到了。

错误出现在这些参数中:

-e environment='Production' -e ASPNETCORE_ENVIRONMENT='Production'

它们必须在没有'的情况下指定,这有效:

-e environment=Production -e ASPNETCORE_ENVIRONMENT=Production

我原来也是-e WEBSITES_PORT=80在Container Startup 脚本中指定的,不需要。

我在 Web App > Container Settings > Startup File(表单字段)中指定了这些额外的启动值,可以从 Web App > Configuration > Startup Command 编辑相同的值(它的相同字段具有不同的名称)。


推荐阅读