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

标签 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 ,作为入口命令,启动服务,并随着它的工作结束,结束,连同它一起关闭容器。

如何启用容器,进而使我的服务继续运行?

我读到了-ddocker run 的论点, 这将 detach容器,所以 docker 将不再监控它,但这也意味着失去对 STDIN 的访问权限等我可能需要。有没有其他方法可以做到这一点,或者是-d正确的方法?

也许另一种选择是从 batch file 启动服务。并在启动命令之后运行一个无限循环,从而使容器保持事件状态?

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

最佳答案

Docker 被设计为在其主进程(带有 PID 1 )退出之前一直保持活力。当它发生时,容器被视为已停止。这个主进程通常不应该是后台进程。

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

你有不同的方法来保持容器的活力,但所有这些方法最终都会让主进程保持活力。不确定是否使用 Windows 容器,但只需使用 sleep 循环即可。
我想到的第一件事就是拥有ping 127.0.0.1 -t > NUL脚本末尾的命令。

关于powershell - 尽管有正在运行的服务,Docker 容器仍会退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56217138/

相关文章:

c# - 用于服务和自动删除以前版本的 Microsoft 安装项目

c# - 在自定义操作中安装 Windows 服务

sql-server - 使用 Powershell 从 sql 表中获取值

powershell - {}在PowerShell中是什么意思?

python - Docker CLI允许使用标签,但是Docker Python API引发APIError

docker - 如何拒绝 kubernetes 中的 docker 注册表?

shell - docker run 导出环境变量的脚本

windows-services - 使用一个 Windows 服务来执行作业,使用两个 Web 应用程序来安排作业

c# - 如何将变量严格键入为特定 WMI 类?

windows - 我可以使用 contains 来匹配对象属性的值吗?