如何将ASP.NET应用程序部署到Azure容器? - 不支持操作系统版本的映像

时间:2018-05-22 17:56:02

标签: asp.net azure containers azure-container-registry azure-container-instances

我正在尝试将ASP.NET Web应用程序部署到Azure容器实例,但是我收到此错误:

  

New-AzureRmContainerGroup:图像的操作系统版本   'bwcontainercr.azurecr.io/azurecontainertest:v1'不受支持。

以下是重现它的步骤:

文件,新建,项目,ASP .NET Web应用程序(.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,它在本地docker容器中运行,没有任何问题。

我使用此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:图像的操作系统版本   

这很糟糕,因为此图像是在VS中添加docker支持时使用的图像。

我尝试了很多不同的图像。这个没有我的应用程序自行部署。

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 :(得分:1)

我有同样的问题,ACI似乎无法运行所有容器,只有基于Windows 2016的容器(与主机有关)所以任何基于Nanoserver的容器(1709告诉我们这是什么你正在使用)只是不工作。

以下是我从微软发现的一个段落:

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

  

不支持图像版本

     

如果指定Azure容器实例不支持的映像,则会返回ImageVersionNotSupported错误。错误的值是不支持图像“{0}”的版本,并且当前适用于Windows 1709图像。要缓解此问题,请使用LTS Windows映像。正在支持Windows 1709图像。

下面是一个使用windowsservercore作为基本映像的工作dockerfile,因此它将在Azure容器实例上运行,但它也会在该基本映像上安装.NET Core 2.0 Runtime,因此您的核心应用程序将运行。

您需要从https://www.microsoft.com/net/download/dotnet-core/runtime-2.0.0下载dotnetcore安装程序并将其添加到项目的根目录,然后将其属性设置为具有Content的构建操作,这样它将被复制到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"]

答案 1 :(得分:1)

微软的一位代表告诉我,Azure容器实例不支持Windows容器。这是他们正在努力的事情,但它还没有。我找不到任何说明这一点的文件,但它似乎是真的。我正在阅读各种各样的东西,说你可以把现有的应用程序运行到一个容器中,但他们不能告诉你的是,至少现在,你必须使用Azure Service Fabric 。它是在Azure中运行Windows容器的唯一方法。

答案 2 :(得分:1)

阅读有关使用哪个基本映像的其他答案,然后返回此处,获取制作dotnet核心容器的最有效方法。

如果您在安装dotnet core运行时时遇到麻烦,则无需这样做。您可以将发布设置为包括它需要的所有dll,因此它处于独立模式,那么您根本不需要安装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,因此您需要在Dockerfile的底部具有ENTRYPOINT行,并创建一个名为init.ps1的powershell脚本,该脚本仅需要行中的&开头很重要:

& "c:\app\myProject.exe"

还将ps1文件设置为Content,以便将其复制到已发布文件夹的根目录。

有了这个,您的容器应该比以往任何时候都小,并且也将实际运行!