在 Windows Docker 容器中运行 exe 程序

4

我无法在Docker中运行Windows exe文件。我已经尝试过使用CMD ["test.exe"]以及交互模式来运行,但所有情况下exe都会立即终止而没有任何错误信息,这使得调试变得困难。是否有人遇到过类似的问题?可能是DLL问题吗?该exe在主机Win 10系统上运行完美无缺。所用的镜像是windowsservercore。


你最终解决了这个问题吗? - Percy
2个回答

2

我曾经面临过类似的问题,尝试在基于windowsservercore的容器中运行exe,就像你怀疑的那样,问题与缺少dll有关。我使用procmon来确定我的进程在启动时加载了哪些dll,然后确保所有这些dll都在容器内可用。在我的情况下,需要在构建镜像时在容器内安装Visual C++ 2015可再发行程序包。


你在常规的非Docker环境中运行procmon,并找出启动时加载了什么。然后,通过适当修改Dockerfile,确保相同的内容可用于你的Docker容器中。 - sxm1972
你能不能解释一下你是怎么使用Procmon的?文档质量太差了。我已经安装它了,但我不知道如何获取所需的信息。 - Percy

0

我曾经遇到过类似的问题。以下是一些帮助您追踪问题的提示。如果您使用完整的Windows映像或者较小的Servercore映像,问题是否仍然存在?

接下来可以尝试在Servercore映像中安装dotnet core运行时(可能还包括aspnet core运行时),如此答案所建议。以下是我编写的一些示例代码,基于该答案但使用了更新版本。请注意,它使用Chocolatey来安装dotnetcore。您可能会遇到DNS问题下载Chocolatey,您可以通过Docker Desktop或daemon.json dns配置解决。您可以在这里检查这些Chocolatey分发的最新版本:

FROM mcr.microsoft.com/windows/servercore:ltsc2019
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
ARG DOTNET_CORE_RUNTIME 3.1.32
RUN Set-ExecutionPolicy Bypass -Scope Process -Force; \
  [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; \
  iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')); \
  choco install dotnetcore-runtime --version=${DOTNET_CORE_RUNTIME} -y;  \
  choco install aspnetcore-runtimepackagestore --version ${DOTNET_CORE_RUNTIME} -y

最后,如果你还遇到困难,可以尝试使用类似 Dependency Walker 这样的工具来查看你的应用程序实际使用了哪些依赖项,然后尝试安装它们。


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