2016-10-05 9 views
1

Ich versuche, einen Dienst in einem Andock-Container auf Windows Server2016 zu installieren.Windows Server 2016 Dockerfile-Installationsdienst

Platzieren Sie einfach den Service dort und Powershelling:

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

Fügt den Dienst jedoch in dem Behälter erhalte ich das Ergebnis:

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 

Ich habe versucht, einen Benutzer zu erstellen und die Startbenutzerdaten einstellen aber dasselbe Problem.

Blick auf https://github.com/Microsoft/sql-server-samples/blob/master/samples/manage/windows-containers/mssql-server-2016-express-windows/dockerfile zeigt, dass sie sqlexpress verwenden, um die Installation des Dienstes zu tun.

Lange Rede kurzer Sinn ... Wie melde ich einen Dienst in einem Container Docker Windows-Server 2016

+1

Versuchen Sie einen vollständig qualifizierten Pfad in '-BinaryPathName'. Außerdem verwenden die MS-Images Windows-Dienste, da sie traditionell in Windows ausgeführt werden. In Docker ist es vorzuziehen, die exe im Vordergrund auszuführen und Docker den Container in den Hintergrund zu stellen, indem Sie mit "-d" ausführen. –

+0

Sie waren richtig, es war der voll qualifizierte Name ... auch bin ich bewusst von -d, aber aufgrund der Komplexität der Legacy zu Docker bringen versucht den "einfachen Weg" – maxfridbe

Antwort

0

Voll die Installation der Qualifikation Name funktioniert. Dank @Elton Stoneman

oder heraus dies auch in meinem Programm arbeitet

 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"); 
     } 
1

Auch am Dockerfile for microsoft/iis aussehen. Die eigentliche Arbeit im Container wird im Windows-Dienst von IIS erledigt, der Einstiegspunkt ist jedoch eine Binärdatei mit der Bezeichnung ServiceMonitor.exe. Der Monitor überprüft den Windows-Dienst. Wenn der Dienst fehlschlägt, schlägt die Exe fehl, sodass Docker weiß, dass der Container fehlerhaft ist.

+0

Ich habe gerade gesehen, ja, ich plane jetzt mit dem zu validieren Service Gesundheit. – maxfridbe

Verwandte Themen