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

标签 windows docker dll containers

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

FROM microsoft/windowsservercore
COPY mydir/myprogram.exe /mydir/
CMD ["/mydir/myprogram.exe","someparameter"]

所以我用以下方法构建图像: docker image build --tag myimage . 并运行容器: docker 运行 myimage 不幸的是,如果我检查容器的状态: docker ps -a 我可以看到容器已经退出了

exit code 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 是可能的,但需要一些时间,我正在寻找一些更优雅的解决方案。

最佳答案

您需要安装 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++ 可再发行组件和适当的版本。您可以找到一些下载网址 here

关于windows - 在 Windows docker 容器中使用退出代码 3221225781(缺少库)调试错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49413443/

相关文章:

docker compose-如何设置名称属性

Docker 容器未启动

docker-compose 在后台构建?

windows - 仅使用系统调用而不是 Windows dll 制作程序

c++ - 无法将参数 5 从 'SIZE_T *' 转换为 'size_t *'——为什么?

C++线程分离进程

c# - 从 DLL 调用函数?

.net - windbg 在 dll 函数调用级别调试 outlook 插件

c++ - cl.exe 在哪里? (MS 构建工具 '13)

windows - Windows 8 x64 上的汇编代码