当入口点指定在后台运行命令时,为什么容器会退出?
例如。如果我运行docker run -d ubuntu bash -c "sleep 12000&"
,则容器退出。如果我运行docker run -d ubuntu bash -c "sleep 12000"
,则容器将继续运行。
后台的进程不足以保持容器运行吗?
为什么在后台或前景中运行的sleep
会对此产生影响?
答案 0 :(得分:1)
根据Docker的说法,容器应该在
时运行容器的主进程(PID 1)正在运行
在您的情况下,主进程bash
和容器“运行”直到该进程退出。
答案 1 :(得分:1)
正如葡萄建议的那样,条件是PID 1正在运行。
该容器设计为短命的,专门用于一项任务(微服务),该任务在前台以PID 1运行。背景当然对于诸如ssh之类的东西很有用,但是容器必须有一项主要工作。
大多数服务都可以在前台或后台运行(取消授权)
PS。如果必须保持容器处于活动状态,请使用tail -f /dev/null
作为CMD
答案 2 :(得分:1)
一个简单的标准可能是:如果您在本地运行命令,并且该命令立即返回并给您一个shell提示,那么,如果您将该命令作为容器中的主进程运行,则该容器将立即退出。 / p>
通常的最佳做法是让容器运行某个进程(例如网络服务器)作为前台进程,并在该服务器退出容器时运行它。在理想的情况下,容器是完全自治的:一旦您docker run
,它就可以在没有任何用户干预的情况下完成其工作。 (在此模型中,没有安装任何软件的纯Ubuntu容器仅sleep
个,就没那么有趣了。)