我正在尝试对使用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
答案 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