使用Docker构建App时,应用程序在构建过程中打开了控制台窗口。

5
我遇到了一个问题,一个 .Net Core WPF 应用程序在启动时会自动打开一个控制台窗口。这只发生在 Docker 容器内部构建时。当我直接在个人电脑上构建时,只有实际的应用程序窗口会打开。
我最好的猜测是,这是基于 .Net Core 镜像的操作系统的问题。.Net Core SDK Docker Hub Repo 知道以下标签: 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/*

以下是翻译的结果:

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

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

2个回答

2

我已经在 3.1-nanoserver-20093.1-nanoserver-2004 上复现了这个问题。

我认为这个问题与构建过程中打印的警告有关:

warning NETSDK1074: 应用程序宿主可执行文件将不会被定制,因为添加资源需要在 Windows 上(不包括 Nano Server)进行构建。

如果是这种情况,那么似乎这是 nanoserver 基础镜像的限制,不幸的是,当在 mcr.microsoft.com/dotnet/nightly/sdk:5.0 中构建时,这个问题仍然存在。

这里 有一个相关的拉取请求,可能会对此有所启示。

话虽如此,我认为目前唯一的选择是使用除了 nanoserver 之外的其他 Windows 镜像(可以在这里找到替代品)。我没有找到任何预装 .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

这里,您将找到安装脚本的文档。
我还确认了生成的应用程序在运行时不会产生控制台窗口。

你的解决方案非常好用。但是我有一个关于你提供的拉取请求的问题:它说这些更改已经在两年前合并了,那么为什么问题仍然存在呢? - TigersEye120
@TigersEye120 该链接的拉取请求引入了排除 Nano Server 的功能(特别是警告中的“排除 Nano Server”部分)。我将其链接作为调查为何此功能在 Nano 上不可用的起点,但我自己并未进行调查。 - Grx70
哦,好吧,我应该注意哪些是绿色的亮点,哪些是红色的。谢谢澄清 xD - TigersEye120
这个解决方案只在安装有 Windows 操作系统的主机上有效,对吗? - novaXire

1
正如@Grx70所提到的,底层nanoserver映像是问题所在。 还有另一个.NET Core映像,但它基于servercore映像。 这样可以在映像中保存手动安装.NET Core,并准备好所有内容。
在此处您可以找到所有版本的.NET Core映像: DockerHub 在底部,您将找到“Windows Server Core 2019 amd64 Tags”标题和相关的“mcr.microsoft.com/dotnet/sdk:5.0-windowsservercore-ltsc2019”映像。
当我构建某些东西时,此映像不再生成控制台窗口 :)

1
如果真是这样的话,这应该成为被采纳的答案。 - Grx70

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接