【问题标题】:trouble debugging error with exit code 3221225781 (missing libraries) in windows docker containerwindows docker容器中退出代码3221225781(缺少库)的故障调试错误
【发布时间】:2018-03-21 17:53:18
【问题描述】:

我正在尝试在 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 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不支持这个功能??? 所以最好的办法就是解决这个问题。使用依赖walker 来遍历所有需要的dll 是可能的,但需要一些时间,我正在寻找一些更优雅的解决方案。

【问题讨论】:

  • 嘿,您找到解决方案了吗?根据您的程序,它可能是 .NET 框架之类的依赖项或 GUI 依赖项(Server Core 不支持)。如果应用程序提供了日志,您可以在运行时传递 -v 参数以将日志写入主机,例如 docker run -v c:\logs:c:\logs myimage
  • 你好。我在这里遇到同样的问题。您是否找到了至少可以解决问题的解决方案?

标签: windows docker dll containers


【解决方案1】:

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

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

    来自 mcr.microsoft.com/windows/sservercore

    WORKDIR 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

【讨论】:

    【解决方案2】:

    这是一个相当开放的问题,因此无法给出准确的答案。以下是一些想法:

    1. 这是 您的 程序缺少依赖项。据推测,您作为程序作者应该知道需要哪些依赖项。您需要确保在构建时将它们包含在您的 docker 镜像中。
    2. 您正在创建基于 Windows Core 的映像,它没有所有 UI 组件。考虑到这些症状,这看起来是最明显的可能出错的事情。所以我要做的是尝试确保您的程序原则上可以在 Windows Core 上运行。这让我想到了下一点。
    3. 在我看来,最实用的故障排除方法是从等式中删除 Docker。你想在 Windows Core 上运行你的程序。因此,设置一台装有 Windows Core 的机器(物理或虚拟机)并尝试在那里运行您的程序。它很有可能不会出现相同的症状。如果是这种情况,您现在已经降低了复杂性,因为您知道您的问题与 docker 无关(或无关)。
    4. 最后,当您的 Windows Core 机器启动并运行时,您可能会立即看到一个带有错误的消息框弹出(即使在 Core 上您也可以运行一些 UI 可以运行的程序,而消息框不是一个不常见的站点),并且即使在 Windows Core 上也无法运行 sysinternals procmon/procexp,因此使用它们来查找丢失的依赖项可能会有所帮助。还有Dependencies

    注意:这个答案中的“Windows Core”是指Core option of Windows Server

    【讨论】:

      猜你喜欢
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多