Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一个代码3221225781的DOCKLIST C++ Windows控制台应用程序 我编写了一个非常简单的C++ Hello World程序< /P> #pragma once #include <iostream> #include <fstream> int main() { std::cout << "Hello Docker world!\n"; return 0; }_C++_Docker - Fatal编程技术网

一个代码3221225781的DOCKLIST C++ Windows控制台应用程序 我编写了一个非常简单的C++ Hello World程序< /P> #pragma once #include <iostream> #include <fstream> int main() { std::cout << "Hello Docker world!\n"; return 0; }

一个代码3221225781的DOCKLIST C++ Windows控制台应用程序 我编写了一个非常简单的C++ Hello World程序< /P> #pragma once #include <iostream> #include <fstream> int main() { std::cout << "Hello Docker world!\n"; return 0; },c++,docker,C++,Docker,然而,当我使用docker run时,它将不显示任何内容,当我使用docker ps-a时,我看到它已退出,代码为3221225781 从一些在线搜索中我了解到,这显然意味着我丢失了一些dll,但我不知道如何找出是哪个 有人能帮我吗?或者告诉我如何才能得到一个简单的C++控制台应用程序在DOCKER中工作? < P>你可以通过使用DOCKER日志来查看问题: docker logs <container name or ID> 很可能您使用了错误的docker图像。查看github

然而,当我使用docker run时,它将不显示任何内容,当我使用docker ps-a时,我看到它已退出,代码为3221225781

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


有人能帮我吗?或者告诉我如何才能得到一个简单的C++控制台应用程序在DOCKER中工作?

< P>你可以通过使用DOCKER日志来查看问题:

docker logs <container name or ID>

很可能您使用了错误的docker图像。查看github上的问题,您似乎需要使用以下Dockerfile:


顺便说一句,我没有windows来测试这个,但如果你玩它,它应该可以工作。可能它也适用于microsoft/windowsservercore映像。

如评论中所确认的,问题源于从MSVC编译的代码的Docker映像上不存在运行库

要解决此问题,您可以:

使用/MT标志静态链接到运行时。 在docker映像上安装正确的运行时。 静态链接 必须将/MT标志或变体传递给msbuild,通过Visual Studio可以从Microsoft的

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

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

ADD $url /vc_redist.exe
RUN C:\vc_redist.exe /quiet /install
对于Visual Studio,以下是截至今天的正确URL,请随意编辑以更新:

其中,$url是指向下面提供的正确Visual Studio可再发行链接的路径:

Visual Studio 2017, Visual Studio 2015, Visual Studio 2013, Docker图像选择
正如OP在评论中所指出的,使用静态运行时链接时,microsoft/nanoserver映像就足够了,但是,如果使用共享运行时链接,则应使用microsoft/windowsservercore映像,否则,可再发行文件的安装将失败。

您是如何为运行时链接DockerHello.exe的?如果使用MSVC,您是否使用了/MT或/MD?如果Docker容器中没有MSVC运行时并与/MD链接,它可能无法找到所需的DLL。我正在使用MSVS 2017。我不理解你的意思是链接到/MD或/MT,所以它很可能是我的问题。每个C或C++应用程序都需要运行时,一个包含C标准库或C++核心功能的库,MSVC允许你在编译代码时静态链接到运行时,因此,运行时不需要安装在代码上运行的计算机上:如果您曾经想知道为什么在运行新应用程序时有时需要安装VisualStudio20xx的VisualC++可重新分配包,这是因为代码被链接到共享运行时/ MD,所以Windows需要安装运行时的DLL版本才能使用代码。它被设置为/MD,I make It/MT,现在可以工作了。谢谢。我以前发现过这个,但它没有显示任何东西。Docker图像不是问题,但安装VC可再发行版是一个很好的猜测,并在评论中得到证实。实际上,我使用microsoft/windowsservercore是为了尝试之前修复它。现在我已经可以使用了,只要我使用静态链接,microsoft/nanoserver似乎也可以作为映像使用。我发现,使用静态链接映像,microsoft/nanoserver就足够了。但是,当我使用安装运行时方法时,我需要使用microsoft/windowsservercore,否则vc_redist的安装失败,这可能是一个因素从两种解决方案中选择一种
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
ADD $url /vc_redist.exe
RUN C:\vc_redist.exe /quiet /install