2016-10-05 17 views
1

Windows server2016上のドッカーコンテナにサービスをインストールしようとしています。Windowsサーバー2016 Dockerfileインストールサービス

は、単にそこにサービスを置き、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を使用していることがわかります。私は完全に名前が機能をインストール予選のWindowsサーバー2016ドッカーコンテナ

+1

'-BinaryPathName'で完全修飾パスを試してください。また、MSイメージはWindowsサービスを使用しています。なぜなら、それは伝統的にWindowsでどのように動作するからですか。 Dockerでは、exeをフォアグラウンドで実行し、 '-d'で実行することによってDockerがバックグラウンドでコンテナを置くようにします。 –

+0

あなたは完全に修飾された名前でもありました...また、-dを認識していますが、ドッカーに遺産をもたらす複雑さのために "簡単な方法"を試しています – maxfridbe

答えて

0

にサービスを登録するにはどうすればよい

かいつまんで... 。おかげ@Eltonストーンマン

か、これは私のプログラムでは、あまりにも動作します

 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

を考え出した。また、Dockerfile for microsoft/iisを見てください。コンテナ内の実際の作業はIIS Windowsサービスで行われますが、エントリポイントはServiceMonitor.exeというバイナリです。モニタがWindowsサービスをチェックします。サービスが失敗した場合、exeが失敗するため、Dockerはコンテナが不健全であることを認識します。

+0

私はちょうどそれを見ました、サービスの健全性。 – maxfridbe

関連する問題