0

我正在尝试在运行 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 base images 。问题是,我找不到针对该服务器版本的 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 项目,所以我可能缺乏一些知识。根据this post dotnet core image is not supported on w2016。

但是我应该能够使用 hiper-v 隔离运行吗? this official 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 服务器上运行

4

1 回答 1

1

根据错误消息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"
于 2019-12-02T16:45:07.393 回答