尽管服务正在运行,但Docker容器仍会退出

时间:2019-05-20 08:38:01

标签: powershell docker windows-services dockerfile

我是Docker的新手。我希望基于Windwows-ServerCore的容器能够按固定的时间间隔执行任务。因此,我决定在我的容器中安装一个服务,该服务可以定期触发这些任务。

这是我的dockerfile-

FROM test2
SHELL ["powershell.exe", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'Continue'; $verbosePreference='Continue';"]
RUN New-LocalUser -Name "testuser" -Password (ConvertTo-SecureString -AsPlainText "CrackPassword!" -Force) -FullName "Test.User" -Description "LocalAdministrator"
RUN Add-LocalGroupMember -Group administrators -Member  testuser -Verbose
RUN "C:/Windows/Microsoft.NET/Framework64/v4.0.30319/InstallUtil.exe" /username=.\testuser /password=CrackPassword! /LogToConsole=true /ShowCallStack TestDockerService.exe
ENTRYPOINT ["powershell"] 
CMD Start-Service \""DockerService\""

问题在于,此容器在启动后退出,大概是Powershell作为进入命令来启动服务,并且随着工作的结束,将容器随其关闭。

如何启用容器并通过扩展使我的服务继续运行?

我通过-d阅读了docker run参数,它将detach用作容器,因此docker将不再监视它,但这也意味着将失去对{{1 }}等。还有另一种方法可以达到相同目的,或者STDIN是正确的方法吗?

也许另一种选择是从-d启动服务,并在start命令之后运行无限循环,从而使容器保持活动状态?

从更广泛的意义上说,如何使batch file处于运行状态(即使服务未运行),以便通过交互式会话进行检查和调试?

2 个答案:

答案 0 :(得分:3)

Docker被设计为保持生存状态,直到其主要进程(带有PID 1)退出为止。发生这种情况时,容器将被视为已停止。通常不应将此主要过程作为背景过程。

您的容器运行Start-Service命令,它成功注册并启动后台服务并退出。而且,因为这是您的主要过程,所以容器停止了。

您有不同的方法来使容器保持活动状态,但是所有这些最终都会使主进程处于活动状态。不确定是否使用Windows容器,但是只需进行睡眠循环即可。 我想到的第一件事就是在脚本末尾使用ping 127.0.0.1 -t > NUL命令。

答案 1 :(得分:0)

我在基于Windows的容器中运行apache,默认情况下该容器也作为服务运行。使用CMD ping 127.0.0.1 -t的解决方案可以使容器保持活动状态,但是效果不是很好,并且会占用额外的资源。使用morepause之类的东西通常会等待用户输入无济于事-容器仍然退出。最后,我最终禁用并停止了apache服务,并在我的dockerfile末尾添加了CMD httpd.exe -n apache以以交互(前景)模式启动apache进程。