Консольное приложение на C ++ для Windows с кодом 2621225781 - PullRequest
0 голосов
/ 22 ноября 2018

Я написал очень простую программу на C ++ hello world

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

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

Это сборка как консольное приложение для Windows x64 выпуска и, таким образом, создает exe

, чем я докеризирую эту программу с помощьюследующий dockerfile

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 или около того, но я понятия не имею, как узнать какой?

Кто-нибудь может мне помочь?Или скажите мне, как я могу получить простое консольное приложение c ++, работающее в докере?

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Скорее всего, вы используете неправильный образ докера.Глядя на эту проблему на github, похоже, что вам нужно использовать следующее Dockerfile:

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

PS У меня нет окон, чтобы проверить это, но если выпоиграйте с этим, оно должно работать.Возможно, это может работать и с изображением microsoft/windowsservercore.

0 голосов
/ 22 ноября 2018

Как подтверждается в комментариях, проблема связана с отсутствием библиотеки времени выполнения в образе Docker для кода, скомпилированного из MSVC.

Чтобы решить эту проблему, вы можете:

  1. Статическая ссылка на среду выполнения с использованием флага /MT.
  2. Установка правильной среды выполнения на образе докера.

Статическое связывание

/MT флаг (или варианты) должен быть передан в msbuild, что через Visual Studio может быть сделано следующим образом (из документации Microsoft ):

Откройте диалоговое окно страниц свойств проекта.Для получения дополнительной информации см. Как: открыть страницы свойств проекта.Разверните папку C / C ++.Выберите страницу свойств Генерация кода.Измените свойство библиотеки времени выполнения.

Установите время выполнения

Чтобы установить правильное время выполнения, необходимо установить распространяемый пакет при создании образа докера.

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

Для Visual Studio это правильный URL-адрес (на сегодняшний день, не стесняйтесь редактировать для обновления):

Где $url - это путь к правильному распространяемому Visual Studio (ссылки приведены ниже):

Выбор изображения Docker

Как отмечает OP в комментариях, изображение microsoft/nanoserver является достаточным при использовании статического связывания во время выполнения, однако при использовании общего связывания во время выполнения вы должны использовать образ microsoft/windowsservercore, в противном случае установка распространяемого файла завершится неудачно.

0 голосов
/ 22 ноября 2018

Вы можете увидеть проблему с помощью журналов докера:

docker logs <container name or ID>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...