在 Windows docker 容器中使用退出代码 3221225781(缺少库)调试错误

air*_*rne 7 windows dll containers docker

我正在尝试在 Windows 10 上运行一个 docker 容器,它应该执行一个 Windows 可执行文件 (myprogram.exe)。您可以在下面找到我的 dockerfile:

FROM microsoft/windowsservercore
COPY mydir/myprogram.exe /mydir/
CMD ["/mydir/myprogram.exe","someparameter"]
Run Code Online (Sandbox Code Playgroud)

因此,我使用以下命令构建映像: docker image build --tag myimage . 并使用以下命令运行容器: docker run myimage 不幸的是,如果我使用以下命令检查容器状态: docker ps -a我可以看到容器已退出

退出代码 3221225781

,这似乎指向丢失的 dll。为了调试问题,我运行以下命令: docker run -it --name debug microsoft/windowsservercore cmd停止容器并复制容器文件系统中的 Windows 可执行文件: docker cp myprogram.exe debug:c:/myprogram.exe 现在我再次使用docker start -i debug并输入myprogram.exe myparameter. 不幸的是,程序立即退出(通常运行大约 30 秒),没有任何输出,错误代码......我对这种行为的唯一解释是,如果某些 cmd 程序缺少某些 dll,则相应的错误消息不包含在 STDERR 中,而是包含在在消息对话框中。显然 docker 不支持这个功能???所以最好的办法就是解决这个问题。使用dependency walker 来完成所有需要的dll 是可能的,但需要一些时间,我正在寻找一些更优雅的解决方案。

Cos*_*ntu 5

您需要安装 Visual C++ 可再发行组件。

  1. 下载适当版本的 vc_redist.x64.exe 并将其放在包含 Dockerfile 的文件夹中
  2. 编辑 Dockerfile,以便在构建映像时通过添加以下内容来预安装 VC++ 可再发行组件:

    mcr.microsoft.com/windows/sservercore

    工作目录 c:\mydir

    复制“vc_redist.x64.exe”。

    运行 vc_redist.x64.exe /install /passive /norestart /log out.txt

    复制 mydir/myprogram.exe c:\mydir

    CMD ["c:\mydir\myprogram.exe","someparameter"]

您的应用程序现在应该可以运行了。

注意:您需要 64 位版本的 VC++ 可再发行组件和适当的版本。你可以在这里找到一些下载地址