尽管有 运行 服务,Docker 容器仍退出
Docker container exits despite having a running service
我是 Docker
的新手。我希望基于 Windwows-ServerCore
的容器能够定期执行任务。为此,我决定在我的容器中安装一个服务,它可以定期触发这些任务。
这是我的 docker 文件 -
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
,作为入口命令,启动服务,随着它的工作结束,容器也随之关闭。
如何启用容器,进而使我的服务保持 运行ning?
我读到 -d
与 docker run
的论点,这将 detach
容器,因此 docker 将不再监视它,但这也意味着无法访问我可能需要的 STDIN
等。是否有另一种方法可以完成相同的任务,或者 -d
是正确的方法吗?
也许另一种选择是在启动命令后从 batch file
和 运行 无限循环启动服务,从而使容器保持活动状态?
从更广泛的角度来看,如何保持 Docker container
运行ning,即使服务不是 运行ning,以便通过交互式会话进行检查和调试,说?
Docker 旨在保持活动状态,直到其主进程(PID 1
)退出。当它发生时,容器被视为已停止。这个主要进程通常不应该是后台进程。
您的容器运行 Start-Service
命令,成功注册并启动后台服务 并退出 。而且,因为它是您的主要进程,所以容器会停止。
你有不同的方法让容器保持活动状态,但所有这些方式最终都会让主进程保持活动状态。不确定 Windows 容器,但只要有一个睡眠循环就可以了。
我想到的第一件事就是在脚本末尾添加 ping 127.0.0.1 -t > NUL
命令。
我是 运行 基于 windows 的容器中的 apache,默认情况下它也作为服务运行。 CMD ping 127.0.0.1 -t
的解决方案可以使容器保持活动状态,但不是很好并且会消耗额外的资源。使用通常会等待用户输入的 more
或 pause
之类的东西没有帮助 - 容器无论如何都会退出。我最终禁用并停止了 apache 服务,并在我的 dockerfile 末尾添加了一个 CMD httpd.exe -n apache
以在交互(前台)模式下启动 apache 进程。
需要将 powershell
添加到 CMD
的末尾。
FROM ...
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'Continue'; $verbosePreference='Continue';"]
RUN ...
CMD Start-Service DockerService; powershell
此外,您只需在 运行 命令末尾添加 powershell
即可覆盖所有 CMD
命令:
docker run -it ... powershell
如果您有一堆 bootstrap 脚本 并且想在 运行 容器时关闭。
我是 Docker
的新手。我希望基于 Windwows-ServerCore
的容器能够定期执行任务。为此,我决定在我的容器中安装一个服务,它可以定期触发这些任务。
这是我的 docker 文件 -
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
,作为入口命令,启动服务,随着它的工作结束,容器也随之关闭。
如何启用容器,进而使我的服务保持 运行ning?
我读到 -d
与 docker run
的论点,这将 detach
容器,因此 docker 将不再监视它,但这也意味着无法访问我可能需要的 STDIN
等。是否有另一种方法可以完成相同的任务,或者 -d
是正确的方法吗?
也许另一种选择是在启动命令后从 batch file
和 运行 无限循环启动服务,从而使容器保持活动状态?
从更广泛的角度来看,如何保持 Docker container
运行ning,即使服务不是 运行ning,以便通过交互式会话进行检查和调试,说?
Docker 旨在保持活动状态,直到其主进程(PID 1
)退出。当它发生时,容器被视为已停止。这个主要进程通常不应该是后台进程。
您的容器运行 Start-Service
命令,成功注册并启动后台服务 并退出 。而且,因为它是您的主要进程,所以容器会停止。
你有不同的方法让容器保持活动状态,但所有这些方式最终都会让主进程保持活动状态。不确定 Windows 容器,但只要有一个睡眠循环就可以了。
我想到的第一件事就是在脚本末尾添加 ping 127.0.0.1 -t > NUL
命令。
我是 运行 基于 windows 的容器中的 apache,默认情况下它也作为服务运行。 CMD ping 127.0.0.1 -t
的解决方案可以使容器保持活动状态,但不是很好并且会消耗额外的资源。使用通常会等待用户输入的 more
或 pause
之类的东西没有帮助 - 容器无论如何都会退出。我最终禁用并停止了 apache 服务,并在我的 dockerfile 末尾添加了一个 CMD httpd.exe -n apache
以在交互(前台)模式下启动 apache 进程。
需要将 powershell
添加到 CMD
的末尾。
FROM ...
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'Continue'; $verbosePreference='Continue';"]
RUN ...
CMD Start-Service DockerService; powershell
此外,您只需在 运行 命令末尾添加 powershell
即可覆盖所有 CMD
命令:
docker run -it ... powershell
如果您有一堆 bootstrap 脚本 并且想在 运行 容器时关闭。