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

use*_*240 1 powershell windows-services docker 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\""
Run Code Online (Sandbox Code Playgroud)

问题是这个容器在启动后退出,大概是Powershell作为入口命令启动服务,随着它的工作结束,容器随之关闭。

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

我读了关于 的-d论点docker run,这将detach是容器,因此 docker 将不再监视它,但这也意味着无法访问STDIN我可能需要的等。是否有另一种方法可以完成相同的操作,或者是-d正确的方法?

也许另一种选择是从 a 启动服务batch file并在启动命令后运行无限循环,这允许容器保持活动状态?

更广泛地说,Docker container即使服务没有运行,如何通过交互式会话进行检查和调试,以保持运行?

gra*_*pes 5

Docker 旨在保持活动状态,直到其主进程(with PID 1)退出。当它发生时,容器被视为停止。这个主要进程通常不应该是后台进程。

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

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

  • `ping 127.0.0.1 -t > NUL` 会消耗网络资源,最好有一个带睡眠的 while 循环 (2认同)