我遇到了应该运行SmartHome应用程序“FHEM”的Docker容器的问题。问题是,在启动之后,初始进程将分叉到后台并在docker Container停止之后退出。
我该如何防止这种情况?
答案 0 :(得分:0)
如果您可以控制该软件,您可以模拟许多其他具有“不进入后台”模式的软件,并为您的启动添加一个跳过后台分支的标志。这可能是最直接的。
或者,您可以创建一个启动应用程序的入口点脚本,然后在启动应用程序后添加while true; do sleep 1000; done
。这样,入口点永远不会返回,并且docker容器继续运行。
答案 1 :(得分:0)
@Tanktalus是对的,使你的软件不是分叉是最好的方法。
但是,如果无法做到这一点,则必须使容器启动脚本与服务进程一样长。有两点需要注意:
--restart=always
等选项确保您的服务正在运行,这将无效。幸运的是,有bash命令wait
。我们举个例子:
$ cat docker_test.sh
perl -e "sleep(5); exit(42);" &
wait `pgrep perl`
这里发生的是1)pgrep perl
会发现perl
进程的pid在后台休眠,2)wait
将等待该进程终止。此外,wait
将返回perl
的退出代码。我们需要的一切:
$ ./docker_test.sh
$ echo $?
42
使用docker,我们得到了这个:
$ docker run -d -v `pwd`/docker_test.sh:/docker_test.sh ubuntu bash /docker_test.sh
537bdfc04554461da7dd6728ca721e4789a08e426adcc01a3359ed22fd16aa1f
[waiting 5 secs]
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
537bdfc04554 ubuntu "bash /docker_test.sh" 41 seconds ago Exited (42) 34 seconds ago happy_almeida