什么是Azure App Services上ASP.NET Core 2.1 Docker容器的正确Windows基本映像

时间:2018-10-02 14:18:19

标签: windows azure docker asp.net-core azure-web-sites

我想创建一个可以在Windows的Azure应用服务上托管的Docker映像。我的应用程序基于ASP.NET Core 2.1,根据official list of .NET images images,我应该能够简单地使用microsoft/dotnet:2.1-aspnetcore-runtime

我可以在Windows机器上成功构建Dockerfile,并且能够在其中运行它而没有问题。但是将其上传到Docker Hub并将其设置为App Service的Docker映像后,我收到以下错误消息:

  

无法在Windows容器中运行此操作系统/版本。   支持的最高操作系统版本是10.0.14393.9999。

根据Azure App Services Documentation,它应支持microsoft/dotnet:2.1-aspnetcore-runtime作为预安装的父映像之一。

在检查Docker映像时,我发现对于Azure应用服务而言,所使用的映像似乎太新了:

"Architecture": "amd64",
"Os": "windows",
"OsVersion": "10.0.17134.285" <-- too new

经过一些研究,我found in this blog post认为Windows上的Azure应用服务可能只接受microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-sac2016图像。所以我试图用这些来重建Docker镜像。

这一次,App Service接受了图像,但无法启动它,并引发了以下日志:

02/10/2018 14:15:09.437 ERROR - Site: rothiewindockerdemo - Image pull reported error. Image: robinmanuelthiel/contosomaintenance-api:latest-windows-sac2016. failed to register layer: re-exec error: exit status 1: output: remove \\?\C:\DockerData\windowsfilter\93b716197958ceb58006ff3d978fcb3202f7866d00d6d8d69513cf0478a17a7f\UtilityVM\Files\Windows\servicing\Packages\Microsoft-UtilityVM-Core-Package~31bf3856ad364e35~amd64~~10.0.14393.0.cat: The process cannot access the file because it is being used by another process.
02/10/2018 14:15:09.437 INFO - Site: rothiewindockerdemo - Image: robinmanuelthiel/contosomaintenance-api:latest-windows-sac2016
Custom Registry: https://index.docker.io

02/10/2018 14:15:09.439 ERROR - Site: rothiewindockerdemo - Pull image completed but it was not found locally. Image: robinmanuelthiel/contosomaintenance-api:latest-windows-sac2016
02/10/2018 14:15:09.441 WARNING - Site: rothiewindockerdemo - Attempt 1 to start container was unsuccessful. Maximum attempts: 3. 
02/10/2018 14:15:09.568 INFO - Site: rothiewindockerdemo - Purging after container failed to start
02/10/2018 14:15:09.582 INFO - Site: rothiewindockerdemo - Purging pending logs after stopping container

那么,Azure App Services上适用于ASP.NET Core 2.1 Docker容器的正确Windows Docker基本映像是什么?

那是我的Dockerfile

#######################################################
# Step 1: Build the application in a container        #
#######################################################

# Download the official ASP.NET Core SDK image 
# to build the project while creating the docker image
FROM microsoft/dotnet:2.1-sdk as build
WORKDIR /app

# Restore NuGet packages
COPY *.csproj .
RUN dotnet restore

# Copy the rest of the files over
COPY . .

# Build the application
RUN dotnet publish --output /out/ --configuration Release

#######################################################
# Step 2: Run the build outcome in a container        #
#######################################################

# Download the official ASP.NET Core Runtime image
# to run the compiled application
FROM microsoft/dotnet:2.1-aspnetcore-runtime

WORKDIR /app

# Open HTTP and HTTPS ports
EXPOSE 80
EXPOSE 443

# Copy the build output from the SDK image
COPY --from=build /out .

# Start the application
ENTRYPOINT ["dotnet", "MyApp.dll"]

3 个答案:

答案 0 :(得分:5)

问题在于, microsoft/dotnet:2.1-aspnetcore-runtime 是一个多体系结构基础映像。这意味着Docker构建将为您的本地计算机(您在其中构建Docker映像的计算机)选择最佳的体系结构。我假设您的本地计算机是Windows 10 April 2018 Update(版本1803-其内部版本号17134.407)。到目前为止,我们仅支持基于Windows Server 2016(版本1709,内部版本号14393.XX)的映像。

为了“强制”特定版本,请改用此基本图像: microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-sac2016 。您可以检查https://hub.docker.com/r/microsoft/dotnet/

中的所有可用标签

我们将专门在文档中对此进行说明。

答案 1 :(得分:1)

重要的是要提到App Service上的Windows容器当前处于预览状态。

在门户上的验证“无法在Windows容器中运行此操作系统/版本。支持的最大OS版本为10.0.14393.9999。”之所以显示,是因为我们正在使用Windows Server 2016 RS1运行服务器,并且当前无法运行RS3 +的容器。我们目前正在努力启用它们,但目前尚无要分享的ETA。

如果验证通过,则表示指定的图像应该可以正常工作,并且您看到的问题与该图像没有直接关系。这是平台中的错误,似乎与此处报告的问题类似:https://github.com/Microsoft/hcsshim/issues/155

我们将继续进行调查,并感谢您报告此问题

答案 2 :(得分:1)

上面被标记为答案的答案不正确。它使您相信使用microsoft / dotnet:2.1-aspnetcore-runtime-nanoserver-sac2016将解决您的问题,但不会解决。我在Azure容器实例上对此进行了测试,但无法正常工作。

解决方案是这样的:当您获得OsVersionNotSupported时,表示该映像是使用不支持的Windows版本创建的,并且Microsoft当前不支持任何SAC版本(SAC是半年频道)。因此,像1709和1803这样的版本将无法使用。同样,上面的“解决方案”将无法使用,因为它使用了SAC2016的标记。

对于您可以在docker文件中使用的所有标签,请转到此处:https://github.com/dotnet/dotnet-docker/blob/master/TAGS.md

您需要转到https://docs.microsoft.com/en-us/azure/container-instances/container-instances-troubleshooting并阅读“不支持映像的OS版本”部分。它明确指出您需要“ ...始终部署基于Windows Server 2016(LTSC)的映像...”。