我写了一个非常简单的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 ++控制台应用程序?
答案 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编译的代码的运行库。
要解决此问题,您可以:
/MT
标志静态链接到运行时。必须将/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的路径(下面提供的链接):
正如OP在注释中所指出的那样,使用静态运行时链接时,microsoft/nanoserver
映像就足够了,但是,如果使用共享运行时链接,则应该使用microsoft/windowsservercore
映像,否则,请安装可重新分配失败。