Я написал очень простую программу 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 или около того, но я понятия не имею, как узнать какой?
Кто-нибудь может мне помочь? Или скажите, как мне получить простое консольное приложение на С ++, работающее в докере?
Как подтверждается в комментариях, проблема связана с отсутствием библиотеки времени выполнения в образе Docker для кода, скомпилированного из MSVC.
Чтобы решить эту проблему, вы можете:
/MT
флаг. /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
Изображение, в противном случае установка распространяемого не удается.
Вы можете увидеть проблему с помощью журналов Docker:
docker logs <container name or ID>
Скорее всего, вы используете неправильный образ докера. Смотря на этот вопрос на 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
изображение также.