Docker分叉过程

时间:2017-02-08 19:14:39

标签: perl docker

我遇到了应该运行SmartHome应用程序“FHEM”的Docker容器的问题。问题是,在启动之后,初始进程将分叉到后台并在docker Container停止之后退出。

我该如何防止这种情况?

2 个答案:

答案 0 :(得分:0)

如果您可以控制该软件,您可以模拟许多其他具有“不进入后台”模式的软件,并为您的启动添加一个跳过后台分支的标志。这可能是最直接的。

或者,您可以创建一个启动应用程序的入口点脚本,然后在启动应用程序后添加while true; do sleep 1000; done。这样,入口点永远不会返回,并且docker容器继续运行。

答案 1 :(得分:0)

@Tanktalus是对的,使你的软件不是分叉是最好的方法。

但是,如果无法做到这一点,则必须使容器启动脚本与服务进程一样长。有两点需要注意:

  1. 脚本必须在服务进程终止时终止。否则,docker将不知道它的终止并且容器将继续运行。使用--restart=always等选项确保您的服务正在运行,这将无效。
  2. 在类似的说明中,如果脚本也以与服务进程相同的退出代码终止,那将是有利的。这可能会使调试问题更容易。
  3. 幸运的是,有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