Служба установки Windows Server 2016 Dockerfile

Я пытаюсь установить службу в контейнере докеров на Windows Server2016.

Просто разместите там сервис и Powershelling:

New-Service -Name Bob -StartupType Automatic -BinaryPathName .\SVCHost.exe

Добавляет сервис, но в контейнере получаю результат:

PS C:\Program Files\COMPANY\Repository> start-service -Name bob
start-service : Service 'bob (Bob)' cannot be started due to the following error: Cannot start service Bob on computer '.'.
At line:1 char:1
+ start-service -Name bob
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (System.ServiceProcess.ServiceController:ServiceController) [Start-Service], ServiceCommandException

Я попытался создать пользователя и установить учетные данные стартового пользователя, но проблема та же.

Глядя на https://github.com/Microsoft/sql-server-samples/blob/master/samples/manage/windows-containers/mssql-server-2016-express-windows/dockerfile показывает, что они используют sqlexpress для установки службы.

Короче говоря ... Как мне зарегистрировать службу в контейнере Docker Windows Server 2016


person maxfridbe    schedule 05.10.2016    source источник
comment
Попробуйте ввести полный путь в -BinaryPathName. Кроме того, образы MS используют службы Windows, потому что они традиционно работают в Windows. В Docker желательно запускать исполняемый файл на переднем плане и позволить Docker поместить контейнер в фоновый режим, запустив -d.   -  person Elton Stoneman    schedule 05.10.2016
comment
ВЫ БЫЛИ ПРАВЫ, это было полностью квалифицированное имя ... также известно о -d, но из-за сложностей с переносом наследства в докер я пытаюсь найти простой способ   -  person maxfridbe    schedule 05.10.2016


Ответы (2)


Также посмотрите Dockerfile для microsoft / iis. Реальная работа в контейнере выполняется в службе IIS Windows, но точка входа - это двоичный файл с именем ServiceMonitor.exe. Монитор проверяет службу Windows, если служба дает сбой, запускается сбой, поэтому Docker знает, что контейнер неисправен.

person Elton Stoneman    schedule 05.10.2016
comment
Я только что увидел, что да, теперь я планирую использовать это для проверки работоспособности службы. - person maxfridbe; 05.10.2016

Полное определение имени установки работает. спасибо @Elton Stoneman

или выяснил, что это тоже работает в моей программе

        public static bool Install(string serviceName, string serviceDescription, string logonUsername, string logonPassword, string exeFile)
        {
            string managementPath = @"\\.\ROOT\CIMV2:Win32_Service";

            ManagementClass mc = new ManagementClass(managementPath);
            ManagementBaseObject inParams = mc.GetMethodParameters("create");
            inParams["Name"] = serviceName;
            inParams["DisplayName"] = serviceDescription;
            inParams["PathName"] = exeFile + " -name " + "\"" + serviceName + "\"";
            inParams["ServiceType"] = ServiceType.Win32OwnProcess;
            inParams["ErrorControl"] = 0;
            inParams["StartMode"] = ServiceStartMode.Automatic;
            inParams["DesktopInteract"] = false;
            inParams["StartName"] = logonUsername;
            inParams["StartPassword"] = logonPassword;
            inParams["LoadOrderGroup"] = null;
            inParams["LoadOrderGroupDependencies"] = null;
            inParams["ServiceDependencies"] = null;

            ManagementBaseObject outParams = mc.InvokeMethod("create", inParams, null);
            string status = outParams["ReturnValue"].ToString();
            return (status == "0" || status == "23");
        }
person maxfridbe    schedule 05.10.2016