我是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
处于运行状态(即使服务未运行),以便通过交互式会话进行检查和调试?
答案 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
的解决方案可以使容器保持活动状态,但是效果不是很好,并且会占用额外的资源。使用more
或pause
之类的东西通常会等待用户输入无济于事-容器仍然退出。最后,我最终禁用并停止了apache服务,并在我的dockerfile末尾添加了CMD httpd.exe -n apache
以以交互(前景)模式启动apache进程。