[我正在尝试在运行OS w2016的生产服务器上以dotnet Core 3.0打包运行在docker映像中的应用程序。
[当我在服务器上运行docker映像时,出现此不兼容的映像错误:
a Windows version 10.0.17763-based image is incompatible with a 10.0.14393 host
据我了解,我需要使用与目标主机兼容的基础映像来构建映像。因此,我需要寻找1607基本图像。问题是,我找不到针对该服务器版本的dotnet Core 3.0的映像。
W2016是最近的,docker应该允许在每台服务器上运行,所以我在这里缺少什么?
为清楚起见,这里我正在尝试写入dockerfile:
#this image not exists for os version 1607
FROM mcr.microsoft.com/dotnet/core/runtime:3.0-nanoserver-1607 AS base
WORKDIR /app
#this image not exists for os version 1607
FROM mcr.microsoft.com/dotnet/core/sdk:3.0-nanoserver-1607 AS build
WORKDIR /src
COPY ["ConsoleApp7/ConsoleApp7.csproj", "ConsoleApp7/"]
RUN dotnet restore "ConsoleApp7/ConsoleApp7.csproj"
COPY . .
WORKDIR "/src/ConsoleApp7"
RUN dotnet build "ConsoleApp7.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "ConsoleApp7.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "ConsoleApp7.dll"]
更新:
这是我的第一个docker项目,所以我可能缺少一些知识。根据此post,w2016不支持dotnet核心映像。
但是我应该能够使用hiper-v隔离运行吗?Following此官方帖子,我尝试运行
我尝试此命令:
docker run -it --isolation=hyperv mcr.microsoft.com/windows/servercore:ltsc2019 cmd
但是它失败并出现以下错误,因为仍然需要兼容的图像:
no matching manifest for windows/amd64 10.0.14393 in the manifest list entries.
Update2:
为清楚起见,错误:
a Windows version 10.0.17763-based image is incompatible with a 10.0.14393 host
为我的探路者应用程序运行基于mcr.microsoft.com/dotnet/core/runtime:3.0-nanoserver-1903的图像时抛出。
问题是如何打包应用程序并在Windows 2016服务器上运行
根据错误消息a Windows version 10.0.17763-based image is incompatible with a 10.0.14393 host
,您正在将Windows版本1607作为Docker主机运行。出现此错误时,您没有提供要引用的标记,因此我将假定它是一个清单标记,例如3.0
。在这种情况下,Docker将尝试将该清单标签解析为与Docker主机兼容的具体标签。由于在Windows 1607上没有针对3.0的已发布标签,您将收到此错误。
尝试通过引用不同的标签或通过Docker命令设置来实现这一目标将无济于事。 您不能使用旧版Windows来构建新版Windows的Docker映像。不管您使用什么隔离设置,都是如此。您需要将Docker主机升级到当前支持的Windows版本。当前支持的Windows版本的.NET Core运行时映像可以在以下位置找到:https://hub.docker.com/_/microsoft-dotnet-core-runtime。
您还可以在此处阅读有关Windows容器版本兼容性的更多信息:https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility
[另一个选择是定义自己的安装.NET Core的Dockerfile。这样,您可以定义要使用的确切Windows基本映像。当官方映像未提供所需的Windows版本时,此功能很有用。由于终止支持,不再有基于1607的Nano Server版本,因此您需要使用Server Core。在这种情况下,您将使用mcr.microsoft.com/windows/servercore:1607
作为基础映像,并在其之上安装.NET Core。有关如何在Dockerfile中安装.NET Core的详细说明,请参见:https://github.com/dotnet/dotnet-docker/blob/master/samples/snippets/installing-dotnet.md。一个例子是:
# escape=`
FROM mcr.microsoft.com/windows/servercore:1607
RUN powershell -Command `
$ErrorActionPreference = 'Stop'; `
$ProgressPreference = 'SilentlyContinue'; `
Invoke-WebRequest `
-UseBasicParsing `
-Uri https://dot.net/v1/dotnet-install.ps1 `
-OutFile dotnet-install.ps1; `
./dotnet-install.ps1 `
-InstallDir '/Program Files/dotnet' `
-Channel 3.0 `
-Runtime dotnet; `
Remove-Item -Force dotnet-install.ps1 `
&& setx /M PATH "%PATH%;C:\Program Files\dotnet"