0

为什么入口点指定在后台运行命令时容器退出?例如,如果我运行docker run -d ubuntu bash -c "sleep 12000&"容器退出。如果我运行docker run -d ubuntu bash -c "sleep 12000"容器继续运行。
后台的进程是否不足以保持容器运行?
为什么sleep在后台或前台运行会影响这一点?

4

3 回答 3

1

根据 Docker 的 mans,容器应该在运行时

容器的主进程(PID 1)正在运行

在您的情况下,主进程bash和容器“运行”直到该进程退出。

于 2019-01-15T13:43:42.680 回答
1

正如葡萄所建议的那样,条件是PID 1正在运行。

该容器被设计为短暂的并且专门用于在前台作为 PID 1 运行的一项任务(微服务)。背景当然对 ssh 之类的东西很有用,但容器必须有一个主要的工作。

大多数服务都可以在前台或后台运行(deamonized)

PS。如果您必须保持容器存活,请使用tail -f /dev/nullasCMD

于 2019-01-15T14:18:33.580 回答
1

一个简单的标准可能如下:如果您在本地运行命令并且它立即返回并返回给您一个 shell 提示符,那么如果您将该命令作为容器中的主进程运行,则容器将立即退出。

通常的最佳实践是让容器运行某个进程,如网络服务器,作为前台进程,当该服务器退出时,容器就完成了。在理想情况下,容器是完全自主的:一旦你使用docker run它,它就可以在没有任何用户干预的情况下完成它的工作。(在这个模型中,一个普通的 Ubuntu 容器,没有安装软件,只有sleeps,没那么有趣。)

于 2019-01-15T14:20:03.097 回答