Как развернуть приложение ASP.NET в контейнере Azure?- OS версия образа не поддерживается - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь развернуть веб-приложение ASP.NET в экземпляре контейнера Azure, но получаю эту ошибку:

New-AzureRmContainerGroup: версия ОС образа 'bwcontainercr.azurecr.io / azurecontainertest: v1 'не поддерживается.

Вот шаги по его воспроизведению:

Файл, Новый, Проект, Веб-приложение ASP .NET (.NET Framework)

Использование .NET Framework 4.6.1

Тип: MVC

Проверено Включить поддержку Docker

Dockerfile содержит

FROM microsoft/aspnet:4.7.1-windowsservercore-1709
ARG source
WORKDIR /inetpub/wwwroot
COPY ${source:-obj/Docker/publish} .

Могунажмите F5, и он будет работать в локальном док-контейнере без проблем.

Я использую этот PowerShell для развертывания в Azure.

Connect-AzureRmAccount
New-AzureRmResourceGroup -Name "bwcontainertestrg"-Location "EastUS"
$registry = New-AzureRMContainerRegistry -ResourceGroupName "bwcontainertestrg" -Name "bwcontainercr" -EnableAdminUser -Sku Basic
$creds = Get-AzureRmContainerRegistryCredential -Registry $registry
$creds.Password | docker login $registry.LoginServer -u $creds.Username --password-stdin
$image = $registry.LoginServer + "/" + "azurecontainertest:v1"
docker tag "azurecontainertest:dev" $image
docker push $image
$secpasswd = ConvertTo-SecureString $creds.Password -AsPlainText -Force
$pscred = New-Object System.Management.Automation.PSCredential($creds.Username, $secpasswd)
$dnsname = "bwcontainertest-" + (Get-Random -Maximum 99999)
New-AzureRmContainerGroup -ResourceGroup "bwcontainertestrg" -Name "bwcontainertestcg" -Image $image -RegistryCredential $pscred -Cpu 1 -MemoryInGB 1 -DnsNameLabel $dnsname -OsType Windows

Это дает мне ошибку выше.Похоже, базовый образ несовместим с экземплярами контейнера Azure.Если я пытаюсь развернуть его напрямую, я получаю ту же ошибку

New-AzureRmContainerGroup -ResourceGroup bwContainerRG -Name "bwcontainertest-1709cg" -Image microsoft/aspnet:4.7.1-windowsservercore-1709 -RegistryCredential $pscred -Cpu 1 -MemoryInGB 1 -DnsNameLabel "bwcontainertest-1709" -OsType Windows

New-AzureRmContainerGroup: версия ОС образа 'microsoft / aspnet: 4.7.1-windowsservercore-1709' не поддерживается.

Это плохо, так как этот образ используется для добавления поддержки докеров в VS.

Я пробовал несколько разных изображений.Это развертывается само без моего приложения.

New-AzureRmContainerGroup -ResourceGroup bwContainerRG -Name "bwcontainertest-corecg" -Image microsoft/aspnet:4.7.1-windowsservercore -RegistryCredential $pscred -Cpu 1 -MemoryInGB 1 -DnsNameLabel "bwcontainertest-core" -OsType Windows

Так что я ссылался на это изображение в моем приложении.Он собирается и запускается в контейнере на моей локальной машине.

Я развернул это, и это удалось.Но когда я перехожу по URL, он выдает ошибку 403.

Что мне здесь не хватает?

TIA, Билл Волохан

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Представитель Microsoft сказал мне, что экземпляры контейнеров Azure не поддерживают контейнеры Windows.Это то, над чем они работают, но пока нет.Я не могу найти никаких документов, в которых говорится об этом, но, похоже, это правда.Я читаю всевозможные материалы, в которых говорится, что вы можете взять свои существующие приложения и запустить их в контейнере, но они не сообщают вам о том, что по крайней мере сейчас вам нужно использовать Azure Service Fabric.Это единственный способ запустить контейнеры Windows в Azure.

0 голосов
/ 12 июля 2018

Прочтите другие ответы о том, какой базовый образ использовать, а затем вернитесь сюда, чтобы найти наиболее эффективный способ создания контейнера ядра dotnet.

Если у вас возникли проблемы с установкой среды выполнения ядра dotnet, выне нужноВы можете настроить публикацию так, чтобы она включала все необходимые библиотеки, поэтому она находится в автономном режиме, тогда вам вообще не нужно устанавливать ядро ​​dotnet.

Я считаю, что образ контейнера меньше.Вот рабочий Dockerfile, главное отличие в строках:

RUN dotnet build -r win10-x64 -c Release -o /app
RUN dotnet publish -c Release -r win10-x64 -o /app

, что заставляет его собираться только для win10-x64.

FROM microsoft/windowsservercore AS base
WORKDIR /app

FROM microsoft/aspnetcore-build:2.0-nanoserver-1709 AS build
WORKDIR /src
COPY mySolution.sln ./
COPY myProject/myProject.csproj myProject/
RUN dotnet restore -nowarn:msb3202,nu1503
COPY . .
WORKDIR /src/myProject
RUN dotnet build -r win10-x64 -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -r win10-x64 -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT [ "powershell.exe", "c:\\app\\init.ps1" ]

Тогда, поскольку автономный режим в ядре создает реальный exe-файл вместо переносимого dll, вам нужно иметь эту строку ENTRYPOINT в нижней части Dockerfile, а также создать скрипт powershell, называемый init.ps1, для которого нужна только одна строка, и в начале важен &:

& "c:\app\myProject.exe"

Также установите для файла ps1 значение Content, чтобы он копировался в корень вашей опубликованной папки.

При этом ваш контейнер должен быть меньше, чем когда-либо прежде, а также фактически будет работать!

0 голосов
/ 29 мая 2018

У меня была та же проблема, ACI, кажется, не в состоянии запустить все контейнеры, только те, которые основаны на Windows 2016 (что-то связанное с тем, чтобы быть хостом), поэтому любые на основе Nanoserver (1709 говорит нам, что это то, чтовы используете) просто не работают.


Вот один абзац, который я нашел от Microsoft об этом:

https://docs.microsoft.com/en-us/azure/container-instances/container-instances-troubleshooting#image-version-not-supported

Версия образа не поддерживается

Если указать изображение, которое не могут поддерживать экземпляры контейнера Azure, возвращается ошибка ImageVersionNotSupported.Значение ошибки: Версия образа '{0}' не поддерживается. В настоящее время применяется к изображениям Windows 1709.Чтобы устранить эту проблему, используйте образ Windows LTS.Поддержка образов Windows 1709.


Ниже приведен рабочий файл Docker, который использует windowsservercore в качестве базового образа, поэтому он будет работать на экземплярах контейнера Azure, но также устанавливает .NET Core 2.0Среда выполнения для этого базового образа, поэтому ваше основное приложение будет работать.

Вам необходимо загрузить установщик dotnetcore из https://www.microsoft.com/net/download/dotnet-core/runtime-2.0.0 и добавить его в корневой каталог вашего проекта, а затем установить его свойства так, чтобыДействие по сборке Контента, таким образом, оно будет скопировано в контейнер Docker во время его построения, чтобы его можно было установить, но не волнуйтесь, оно будет удалено до того, как изображение будет завершено, поэтому ваше изображение не будет сильно расти:

FROM microsoft/windowsservercore AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0-nanoserver-1709 AS build
WORKDIR /src
COPY mysolution.sln ./
COPY myproject/myproject.csproj myproject/
RUN dotnet restore -nowarn:msb3202,nu1503
COPY . .
WORKDIR /src/myproject
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

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

#Install .NET Core
RUN dotnet-runtime-2.0.0-win-x64.exe /quiet /install

#Tidy up by removing the installer
RUN Del dotnet-runtime-2.0.0-win-x64.exe

ENTRYPOINT ["dotnet", "myproject.dll"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...