Windows Server 2016 Dockerfile 安装服务

Posted

技术标签:

【中文标题】Windows Server 2016 Dockerfile 安装服务【英文标题】:Windows Server 2016 Dockerfile install service 【发布时间】:2016-10-05 13:38:11 【问题描述】:

我正在尝试在 windows server2016 上的 docker 容器中安装服务。

只需将服务放在那里并进行 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 server 2016 Docker 容器中注册服务

【问题讨论】:

-BinaryPathName 中尝试一个完全限定的路径。此外,MS 映像使用 Windows 服务,因为这是它们在 Windows 中的传统运行方式。在 Docker 中,最好在前台运行您的 exe,并让 Docker 通过运行 -d 将容器置于后台。 你说得对,它是完全合格的名称......我也知道 -d 但由于将遗留问题带到 docker 的复杂性,我正在尝试“简单的方法” 【参考方案1】:

另外,请查看Dockerfile for microsoft/iis。容器中的真正工作是在 IIS Windows 服务中完成的,但入口点是一个名为 ServiceMonitor.exe 的二进制文件。监视器检查 Windows 服务,如果服务失败,则 exe 失败,因此 Docker 知道容器不健康。

【讨论】:

我刚看到是的,现在正计划使用它来验证服务运行状况。【参考方案2】:

完全限定安装名称有效。谢谢@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");
        

【讨论】:

以上是关于Windows Server 2016 Dockerfile 安装服务的主要内容,如果未能解决你的问题,请参考以下文章

windows server 2016安装哪个版本

windows server 2016有几个版本

Upgrade Windows Server 2016 to Windows Server 2019

windows server2016都有哪些版本?

Windows Server 2016- Windows Server 2016 上 HYPER-V 中的新增功能

Windows Server 2016怎么激活?急急急!