dockerized C ++ Windows控制台应用程序退出,代码为3221225781

时间:2018-11-22 12:51:11

标签: c++ docker

我写了一个非常简单的c ++ hello world程序

#pragma once
#include <iostream>
#include <fstream>

int main()
{
   std::cout << "Hello Docker world!\n";
   return 0;
}

这是作为x64版本Windows控制台应用程序构建的,因此会产生一个exe

比我使用以下dockerfile将该程序docker化

FROM microsoft/windowsservercore

ADD ./DockerHello.exe /DockerHello.exe

# Run exe when the container launches
CMD C:\DockerHello.exe

但是,当我使用docker run时,它什么也不会显示;当我使用docker ps -a时,我看到它已经退出,代码为3221225781

从一些在线搜索中我了解到,这显然意味着我缺少一些dll,但是我不知道如何找出哪个dll。

有人可以帮助我吗?还是告诉我如何在docker中运行一个简单的c ++控制台应用程序?

3 个答案:

答案 0 :(得分:1)

很可能您使用的是错误的docker映像。在github上查看this问题,看来您需要使用以下label

Dockerfile

P.S。我没有用于测试的窗口,但是如果您试用它,它应该可以正常工作。也许它也可以与FROM microsoft/dotnet-framework:4.6.2 ADD https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x64.exe /vc_redist.x64.exe RUN C:\vc_redist.x64.exe /quiet /install ADD ./DockerHello.exe /DockerHello.exe CMD C:\DockerHello.exe 图片一起使用。

答案 1 :(得分:0)

您可以通过使用docker日志来查看问题:

docker logs <container name or ID>

答案 2 :(得分:0)

正如评论中所确认的那样,该问题是由于Docker映像中不存在用于从MSVC编译的代码的运行库。

要解决此问题,您可以:

  1. 使用/MT标志静态链接到运行时。
  2. 在docker映像上安装正确的运行时。

静态链接

必须将/MT标志(或变体)传递给msbuild,这可以通过Visual Studio进行以下操作(来自Microsoft的documentation):

  

打开项目的“属性页”对话框。有关详细信息,请参见如何:打开项目属性页。   展开C / C ++文件夹。   选择代码生成属性页。   修改运行时库属性。

安装运行时

要安装正确的运行时,必须在构建docker映像时安装可再发行组件。

ADD $url /vc_redist.exe
RUN C:\vc_redist.exe /quiet /install

对于Visual Studio,这些是正确的URL(截至今天,请随时进行编辑以更新):

$url是正确的Visual Studio Redistributable的路径(下面提供的链接):

Docker映像选择

正如OP在注释中所指出的那样,使用静态运行时链接时,microsoft/nanoserver映像就足够了,但是,如果使用共享运行时链接,则应该使用microsoft/windowsservercore映像,否则,请安装可重新分配失败。