4

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

New-AzureRmContainerGroup:不支持映像“bwcontainercr.azurecr.io/azurecontainertest:v1”的操作系统版本。

以下是重现它的步骤:

文件、新建、项目、ASP .NET Web 应用程序(.NET 框架)

使用 .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 :不支持映像“microsoft/aspnet:4.7.1-windowsservercore-1709”的操作系统版本。

这很糟糕,因为当您在 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,比尔·沃罗汉

4

3 回答 3

1

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

如果您在安装 dotnet 核心运行时时遇到问题,则不需要。您可以将发布设置为包含它需要的所有 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,以便将其复制到已发布文件夹的根目录。

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

于 2018-07-12T08:10:30.047 回答
1

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


这是我从微软那里找到的一段:

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

不支持图像版本

如果指定 Azure 容器实例无法支持的映像,则会返回 ImageVersionNotSupported 错误。错误的值为 The version of image '{0}' is not supported.,目前适用于 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 安装程序并将其添加到项目的根目录,然后将其属性设置为构建内容的操作,这样它就会在构建它的同时被复制到 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"]
于 2018-05-29T11:23:18.810 回答
0

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

于 2018-06-01T20:13:56.463 回答