gpt4 book ai didi

docker - 在 Windows 10 Pro 上创建 .NET Core 3.1 应用程序的 Docker 镜像并将其拉到 Windows Server 2016

转载 作者:行者123 更新时间:2023-12-04 07:50:50 24 4
gpt4 key购买 nike

我已成功创建了包含 .NET Core 3.1 项目的 Docker 镜像,并在本地 Windows 10 Pro 计算机上的 Windows Containers 中运行它们。我使用的是 Windows 容器,而不是 Linux。
我希望能够将它们拉到 Windows 2016 Server 机器(不是 VM)。我在 Windows 2016 Server 上安装了 Docker EE 并且它正在运行。 docker 版本报告版本 20.10.0。
根据以下内容,没有任何受支持的 .NET Core 镜像可用于 Windows Server 2016。no matching manifest for windows/amd64 Server 2016
如果这是真的,我是否正在尝试做一些不可能的事情?还是根本不支持?
我是新手,但据我所知,.NET Core 应用程序需要在主机中安装 nanoserver 1809 或更高版本。如果那是不正确的,请告诉我...
注意:我已成功将其拉到 Windows 2016 Server:

docker pull mcr.microsoft.com/windows/nanoserver:sac2016
但从我在这里读到的, https://github.com/dotnet/dotnet-docker/issues/1041 , .NET Core 3.x 在该基础上不再受支持。
第 1 期
当我在 Windows 2016 Server 上运行以下命令时,出现错误“ list 列表条目中没有 windows/amd64 10.0.14393 的匹配 list ”。
docker pull mcr.microsoft.com/windows/nanoserver:1809
根据这个页面,我应该可以拉: https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/deploy-containers-on-server
第 2 期
从我读到的内容看来,我需要创建我的图像,或者至少在容器中以“hyperv”隔离模式运行它们。正确的?或者 docker 主机本身是否可以运行不同版本的操作系统(如 nanoserver 1809 或其他)?我正在使用 Visual Studio 在本地构建所有这些,并且还在使用 docker-compose,我可以在 yml 文件中指定隔离模式。但是当我通过 VS.NET 将我的图像发布到我的 Docker Hub 时,我不知道该怎么做。我的图像发布成功,但是当我尝试使用 docker pull 将它们带到 Windows 2016 Server 时,我收到此错误:
a Windows version 10.0.19042-based image is incompatible with a 10.0.14393 host
第 3 期
与上述错误相关,我想我需要在我的镜像中包含较旧的 Windows 基础版本?我已将以下内容添加到我的 dockerfile 中:
FROM mcr.microsoft.com/windows/nanoserver:1809
但它似乎没有做任何事情。当我在 VS.NET 中运行项目时,我在检查容器时看到了这一点:
OsVersion: 10.3.19042.867
我进行概念验证的目标很简单:
  • 在我的 Windows 10 Pro 笔记本电脑上创建 .NET Core 3.1 Web api 项目的图像
  • 将它拉到 Windows 2016 服务器并在 Docker 容器中运行它。

  • #1 都适用于我的笔记本电脑。让#2 完成是我真的很困惑的地方。
    谢谢,布伦特
    更新
    下面是我用来构建镜像、在容器中运行并检查它的 Dockerfile 和命令。请注意,使用此 Dockerfile,在交互式命令提示符中,我现在可以看到:
  • 正确的操作系统版本:10.0.14393
  • 文件系统确实包含我的 .Net 解决方案、项目和我的源代码。

  • 我刚刚采用了 MattT 提供的内容,并将其添加到我添加 DockerSupport 时 VS.NET 生成的 Dockerfile 的开头。我知道我搞砸了我的 Dockerfile,因为它没有构建/发布或运行我的 webapi 项目(就像在添加新命令之前那样)。我认为这与我的 FROM 语句有关。我读了这么多,但还不明白分层是如何工作的,等等。
    # escape=`
    FROM mcr.microsoft.com/windows/servercore:ltsc2016 AS baseOS
    RUN powershell -Command [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; $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.1 -Runtime dotnet; Remove-Item -Force dotnet-install.ps1 && setx /M PATH "%PATH%;C:\Program Files\dotnet"
    COPY . .

    FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base

    WORKDIR /app
    EXPOSE 80
    EXPOSE 8001

    FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
    WORKDIR /src
    COPY ["WebApi.csproj", "."]

    RUN dotnet restore "WebApi.csproj"
    COPY . .

    WORKDIR "/src/"
    RUN dotnet build "WebApi.csproj" -c Release -o /app/build

    FROM build AS publish
    RUN dotnet publish "WebApi.csproj" -c Release -o /app/publish

    FROM base AS final
    #FROM baseOS AS final
    WORKDIR /app
    COPY --from=publish /app/publish .
    ENTRYPOINT ["dotnet", "WebApi.dll"]
    我运行的 docker 命令:
    docker build -f "C:\Cabinet\Learning\EssApiProjects\src\Services\WebApi\Dockerfile" --force-rm -t webapi:ltsc2016 --target baseOS "C:\Cabinet\Learning\EssApiProjects\src\Services\WebApi"

    docker run --env ASPNETCORE_ENVIRONMENT=Development -p 8001:80 --name webapi_ltsc2016 -it webapi:ltsc2016

    docker exec -it webapi_ltsc2016 cmd.exe

    最佳答案

    支持的内容和可用的内容之间存在差异。支持在 Windows Server 2016 上的容器中运行 .NET Core,但没有可用的镜像。你可以定义你自己的。
    您对哪些 Windows 容器版本可以在 Windows Server 2016 主机上运行的选项仅限于 Windows Server 2016 容器。这意味着您不能运行 nanoserver:1809例如,Server 2016 主机上的容器。这在 Windows container version compatibility matrix 中有说明:
    enter image description here
    请注意 nanoserver:sac2016长期以来一直不受支持,因此它不是推荐的基础镜像。 2016 上的 Nano Server 目前没有任何支持的标签。相反,建议使用 Windows Server Core。 servercore:ltsc2016是支持标签的最佳选择。
    以下是如何在服务器核心镜像上安装 .NET Core 的示例:

    # escape=`

    FROM mcr.microsoft.com/windows/servercore:ltsc2016
    RUN powershell -Command `
    $ErrorActionPreference = 'Stop'; `
    $ProgressPreference = 'SilentlyContinue'; `
    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;
    Invoke-WebRequest `
    -UseBasicParsing `
    -Uri https://dot.net/v1/dotnet-install.ps1 `
    -OutFile dotnet-install.ps1; `
    ./dotnet-install.ps1 `
    -InstallDir '/Program Files/dotnet' `
    -Channel 3.1 `
    -Runtime aspnetcore; `
    Remove-Item -Force dotnet-install.ps1 `
    && setx /M PATH "%PATH%;C:\Program Files\dotnet"
    更多资源:
  • .NET install script
  • Methods of installing .NET in a container

  • 更新
    下面是一个如何使用 Visual Studio 生成的 Dockerfile 定义它的示例:
    # escape=`
    FROM mcr.microsoft.com/windows/servercore:ltsc2016 AS base

    # Install ASP.NET Core 3.1
    RUN powershell -Command `
    $ErrorActionPreference = 'Stop'; `
    $ProgressPreference = 'SilentlyContinue'; `
    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;
    Invoke-WebRequest `
    -UseBasicParsing `
    -Uri https://dot.net/v1/dotnet-install.ps1 `
    -OutFile dotnet-install.ps1; `
    ./dotnet-install.ps1 `
    -InstallDir '/Program Files/dotnet' `
    -Channel 3.1 `
    -Runtime aspnetcore; `
    Remove-Item -Force dotnet-install.ps1 `
    && setx /M PATH "%PATH%;C:\Program Files\dotnet"

    WORKDIR /app
    EXPOSE 80
    EXPOSE 8001

    FROM mcr.microsoft.com/windows/servercore:ltsc2016 AS build

    # Install .NET Core 3.1 SDK
    RUN powershell -Command `
    $ErrorActionPreference = 'Stop'; `
    $ProgressPreference = 'SilentlyContinue'; `
    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;
    Invoke-WebRequest `
    -UseBasicParsing `
    -Uri https://dot.net/v1/dotnet-install.ps1 `
    -OutFile dotnet-install.ps1; `
    ./dotnet-install.ps1 `
    -InstallDir '/Program Files/dotnet' `
    -Channel 3.1; `
    Remove-Item -Force dotnet-install.ps1 `
    && setx /M PATH "%PATH%;C:\Program Files\dotnet"

    WORKDIR /src
    COPY ["WebApi.csproj", "."]

    RUN dotnet restore "WebApi.csproj"
    COPY . .

    WORKDIR "/src/"
    RUN dotnet build "WebApi.csproj" -c Release -o /app/build

    FROM build AS publish
    RUN dotnet publish "WebApi.csproj" -c Release -o /app/publish

    FROM base AS final
    WORKDIR /app
    COPY --from=publish /app/publish .
    ENTRYPOINT ["dotnet", "WebApi.dll"]

    关于docker - 在 Windows 10 Pro 上创建 .NET Core 3.1 应用程序的 Docker 镜像并将其拉到 Windows Server 2016,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66989134/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com