我可以在 windows 2016 上托管的 docker 上的 dotnet core 3.0 应用程序上 运行 dotnetcore 吗?

Can I run dotnetcore on dotnet core 3.0 app from a docker hosted on a windows 2016?

我正在尝试 运行 在 dotnet Core 3.0 上构建一个应用程序,打包在 docker 图像中,在生产服务器上 运行ning OS w2016。

当我 运行 服务器上的 docker 图像时,我得到了这个不兼容的图像错误:

a Windows version 10.0.17763-based image is incompatible with a 10.0.14393 host

据我了解,我需要使用与目标主机兼容的基础映像来构建映像。 所以,我需要寻找 1607 基本图像。 问题是,我找不到针对该服务器版本的 dotnet Core 3.0 图像。

W2016 是最近的,docker 应该允许在每个服务器中 运行,所以我在这里缺少什么?

为清楚起见,这里是我要写入的docker文件:

#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这位官方post,我试试运行

我试试这个命令:

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.

更新2:

为清楚起见,错误:

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

更新

另一种选择是定义您自己的 Docker 安装 .NET Core 的文件。这样您就可以定义要使用的确切 Windows 基础图像。当官方图像不提供您需要的 Windows 版本时,这很有用。由于支持终止,不再提供基于 1607 的 Nano Server 版本,因此您需要使用 Server Core。在这种情况下,您将使用 mcr.microsoft.com/windows/servercore:1607 作为基础映像并在其上安装 .NET Core。有关如何在 Docker 文件中安装 .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"