为什么入口点指定在后台运行命令时容器退出?例如,如果我运行docker run -d ubuntu bash -c "sleep 12000&"
容器退出。如果我运行docker run -d ubuntu bash -c "sleep 12000"
容器继续运行。
后台的进程是否不足以保持容器运行?
为什么sleep
在后台或前台运行会影响这一点?
问问题
41 次
3 回答
1
根据 Docker 的 mans,容器应该在运行时
容器的主进程(PID 1)正在运行
在您的情况下,主进程bash
和容器“运行”直到该进程退出。
于 2019-01-15T13:43:42.680 回答
1
正如葡萄所建议的那样,条件是PID 1正在运行。
该容器被设计为短暂的并且专门用于在前台作为 PID 1 运行的一项任务(微服务)。背景当然对 ssh 之类的东西很有用,但容器必须有一个主要的工作。
大多数服务都可以在前台或后台运行(deamonized)
PS。如果您必须保持容器存活,请使用tail -f /dev/null
asCMD
于 2019-01-15T14:18:33.580 回答
1
一个简单的标准可能如下:如果您在本地运行命令并且它立即返回并返回给您一个 shell 提示符,那么如果您将该命令作为容器中的主进程运行,则容器将立即退出。
通常的最佳实践是让容器运行某个进程,如网络服务器,作为前台进程,当该服务器退出时,容器就完成了。在理想情况下,容器是完全自主的:一旦你使用docker run
它,它就可以在没有任何用户干预的情况下完成它的工作。(在这个模型中,一个普通的 Ubuntu 容器,没有安装软件,只有sleep
s,没那么有趣。)
于 2019-01-15T14:20:03.097 回答