在Windows Docker容器中运行Visual Studio C ++ 2017编译的可执行文件

时间:2019-12-13 13:56:55

标签: powershell docker docker-compose dockerfile windows-container

我正在尝试对使用Visual Studio C ++ 2017编译的简单C ++ Hello-World应用程序(发行版本)进行泊坞化。

Hello World应用程序仅向控制台打印一行,写入一个虚拟文件,然后进入无限循环。在已经安装了VC15运行时并且VS2017正常运行的机器上,它完全可以正常工作。

我正在使用基本映像 microsoft / windowsservercore:1803 ,旋转一个容器,并将完全相同的应用程序复制到其中。我已经尝试了多次,但是该应用程序无法启动。为了确保我也将整个VC运行时从我的系统手动复制到了容器中,并且还在容器中安装了VC运行时。

这是我正在使用的Dockerfile:

FROM microsoft/windowsservercore:1803

SHELL ["powershell.exe", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
ADD https://aka.ms/vs/15/release/vc_redist.x64.exe C:\vc_redist.x64.exe

COPY ["hello-world.exe", "C:/hello-world.exe"]

RUN Start-Process C:\vc_redist.x64.exe -ArgumentList '/quiet' -Wait ;
RUN Start-Process C:\hello-world.exe

我尝试在容器内运行Powershell,并手动启动可执行文件。但是什么也没发生。没有日志,没有任何痕迹。

如何获取此可执行文件以启动?这是我在VS Project中用于创建可执行文件的唯一文件:

// hello-world.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include "pch.h"
#include <iostream>
#include <cstdio>
#include <fstream>
#include <vector>
#include <array>

int main()
{
    printf("%s\n","Hello World!");
    std::FILE* f1;

    if (fopen_s(&f1, "./temp_output.txt", "w"))
    {
        std::array<int, 3> v = { 42, -1, 7 }; // underlying storage of std::array is an array
        fwrite(&v, sizeof(int), static_cast<int>(v.size()), f1);

    }
    while (1){ }

}

在容器内部手动启动可执行文件的命令集:

1. docker build -t windows-server-core-1803 -f Dockerfile .
2. docker run <Imageid>
3. docker exec -it <ImageId> powershell
4. PS >> .\hello-world.exe

1 个答案:

答案 0 :(得分:0)

引用我的 docker 镜像和 Dockerfile 我使用 C++、VS2017、控制台制作“Hello Docker”程序,并将 helloDocker.exe 文件放在同一个 Dockerfile 文件夹中

中心: https://hub.docker.com/repository/docker/jykim0824/hellodockerwithvcredist

Dockerfile:

FROM mcr.microsoft.com/windows/servercore:ltsc2019

ADD https://download.microsoft.com/download/6/D/F/6DF3FF94-F7F9-4F0B-838C-A328D1A7D0EE/vc_redist.x64.exe /vc_redist.x64.exe 

RUN C:\vc_redist.x64.exe /quiet

WORKDIR C:\mydir 

COPY . . 

CMD helloDocker.exe