Не удается получить ASP. Net Core Docker изображение для запуска в Azure контейнере веб-приложения - PullRequest
0 голосов
/ 21 апреля 2020

Я несколько дней пытался заставить работать Azure Linux Container Web App. У меня есть веб-интерфейс, встроенный в Angular и asp. net core 3.1, в котором все это работает, и у меня есть Dockerfile, который собирает все это.

Сайт angular размещен в папке asp. net core wwwroot.

Я могу запустить приложение без проблем. Я также могу запустить его на рабочем столе Docker без проблем.

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

Затем я создаю этот докер-файл в Devops с конвейером .yml и отправляю в Azure ACR с:

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

Это также работает, и я вижу, что отправлено в Azure Реестр контейнеров.

Затем я перезапускаю веб-приложение Azure, чтобы оно перезагружалось с последним образом и получало в консоли следующее:

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, где Azure вылетает, если окончания строк - это что-то отличное от / lf. Я использовал notepad ++, чтобы проверить это, и удостоверился, что у меня только конец строки типа unix / linux. Но это не имело никакого значения.

1 Ответ

0 голосов
/ 22 апреля 2020

Я понял это.

Ошибка была в следующих параметрах:

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

Они должны быть указаны без ', это работает:

-e environment=Production -e ASPNETCORE_ENVIRONMENT=Production

Я изначально также указал -e WEBSITES_PORT=80 в сценарий запуска контейнера, он не был нужен.

Я указал эти дополнительные значения запуска в Web App> Настройки контейнера> Файл запуска (поле формы), это же значение можно изменить в Web App> Configuration> Startup Command (это то же поле с другим именем).

...