docker — консольное приложение C ++ для Windows, подключаемое к док-станции, с кодом 3221225781

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

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

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

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

чем я dockerize эту программу, используя следующий 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 или около того, но я понятия не имею, как узнать какой?

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

1

Решение

Как подтверждается в комментариях, проблема связана с отсутствием библиотеки времени выполнения в образе 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 (ссылки приведены ниже):

Как отмечает в комментариях ФП, microsoft/nanoserver изображение достаточно при использовании статического связывания во время выполнения, однако, если вы используете совместное связывание во время выполнения, вы должны использовать microsoft/windowsservercore Изображение, в противном случае установка распространяемого не удается.

0

Другие решения

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

docker logs <container name or ID>
0

Скорее всего, вы используете неправильный образ докера. Смотря на этот вопрос на 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

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

0
Похожие вопросы
Добавить ответ
Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Нажимая кнопку «Отправить», я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности этого сайта.