使用 Docker 构建时应用程序会打开控制台窗口

Tig*_*120 5 c# wpf docker .net-core

我面临的问题是 .Net Core WPF 应用程序在启动时自动打开控制台窗口。仅当在 Docker 容器内构建时才会发生这种情况。当我直接在 PC 上构建它时,只会打开实际的应用程序窗口。

我最好的猜测是,这是 .Net Core 映像所基于的操作系统的问题。.Net Core SDK Docker Hub 存储库识别以下标签:3.1-nanoserver-1809、3.1-nanoserver-1903、3.1-nanoserver-1909、3.1-nanoserver-2004、3.1-nanoserver-2009。我能够用前三个标签确认问题,但 2004 和 2009 标签不能在我的机器上运行,所以我需要有人尝试一下并确认我的理论(这意味着它不应该发生在至少这些图像中的一个)或更好地解释为什么会发生这种情况。


这可以通过 Visual Studio 为您创建的默认 .Net Core WPF 应用程序重现。这是一个用于测试它的 Dockerfile:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /src

COPY . ./
RUN dotnet build -c Debug -o out

FROM stefanscherer/chocolatey
WORKDIR /app

RUN choco install -y 7zip

# Depending on your project setup it might be src/[project name]/out
COPY --from=build /src/out ./test 

RUN 7z a -y test.zip ./test/*
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令构建映像并提取编译后的程序:

docker build -t testimage .
docker run -d --name testcontainer testimage
docker stop testcontainer
docker cp testcontainer:app/test.zip .

Grx*_*x70 2

我能够在两者上重现这个问题3.1-nanoserver-20093.1-nanoserver-2004为您重现这个问题。

我认为问题与构建期间打印出的警告有关:

警告 NETSDK1074:不会自定义应用程序主机可执行文件,因为添加资源需要在 Windows(不包括 Nano Server)上执行构建。

如果是这样的话,那么这似乎是nanoserver基础映像的限制,不幸的是,这个问题看起来仍然没有得到解决,因为它在构建时仍然存在mcr.microsoft.com/dotnet/nightly/sdk:5.0

这是一个相关的拉取请求,可能会对这个主题有所启发。

话虽如此,我认为目前唯一的选择是使用 Windows 映像nanoserver(可以在此处找到替代方案)。我没有找到任何预装的 .NET Core SDK 附带的映像(尽管我没有花太多精力来找到它),但设置它应该相当简单。在下面的示例中,我使用了servercore图像,因为它比图像轻得多windows

FROM mcr.microsoft.com/windows/servercore:20H2 AS sdk
WORKDIR /dotnet
# Download the official .NET Core install script
RUN powershell -c "Invoke-WebRequest -Uri https://dot.net/v1/dotnet-install.ps1 -OutFile dotnet-install.ps1"
# Run the install script
RUN powershell -c "& ./dotnet-install.ps1 -InstallDir ."
# Add the installed executable to PATH
RUN setx PATH "%PATH%;/dotnet"

FROM sdk AS build
# Do your stuff here
Run Code Online (Sandbox Code Playgroud)

您可以在这里找到安装脚本的文档。

我还确认生成的应用程序在运行时不会生成控制台窗口。