docker exec命令在完成执行后不会返回

时间:2016-06-16 03:04:14

标签: docker exec

我根据图像启动了一个docker容器,该图像有一个文件" run.sh"在里面。在shell脚本中,我使用docker exec,如下所示

docker exec <container-id> sh /test.sh

test.sh完成执行但是在我按ctrl + C之前,docker exec不会返回。结果,我的shell脚本永远不会结束。任何可能导致此问题的指针。

5 个答案:

答案 0 :(得分:2)

我可以通过添加receiver.DefaultSmsSubscriptionChangeReceiver widget.BugleWidgetProvider widget.WidgetConversationProvider receiver.StorageStatusReceiver 参数来实现它:

-it

答案 1 :(得分:0)

我的作品就像这个命令的魅力。也许你只是忘记了二进制文件的路径( / bin / sh )?

 Declare @Counter int 
 Set @Counter=(SELECT Count(Student_ID) as 'StudentCount' FROM tbCourseSemOne 
 where Student_ID=1 Having Count(Student_ID) < 6 and Count(Student_ID) > 0)
 if(@Counter <6)
 print'Sorry! You cannot add more than five subject data for a single stduent'
 else
 print'Insert Code'

文件位置

docker exec 7bd877d15c9b /bin/bash /test.sh

文件内容:

/test.sh

<强>输出:

#!/bin/bash
echo "Hi"
echo
echo "This works fine"
sleep 5
echo "5"

答案 2 :(得分:0)

我的情况是带有内容的脚本a.sh
喜欢

php test.php &

如果我像执行

docker exec contianer1 a.sh

它也再也没有回来。

经过半天的谷歌搜索并尝试
将a.sh更改为

php test.php >/tmp/test.log 2>&1 &

有效!

所以它似乎与stdin / out / err有关。

>/tmp/test.log 2>&1

请尝试。

请注意,我的test.php是一个死循环脚本,它监视指定的进程,如果该进程关闭,它将重新启动它。因此,test.php将永远不会退出。

答案 3 :(得分:0)

here所述,当您具有保持stdout或stderr打开的进程时,就会发生这种“挂起”行为。

为防止这种情况发生,每个长时间运行的进程应:

  1. 后台中执行,并且
  2. 关闭两者 stdout和stderr或重定向到文件或/dev/null

因此,我将确保容器中已经运行的所有进程以及传递给docker exec的脚本均符合上述条件。

答案 4 :(得分:-1)

好,我明白了。

docker stop a590382c2943

docker start a590382c2943

那会没事的。

docker exec -ti a590382c2943 echo "5"

将立即返回,而无论是否添加-it,都不会使用

实际上,在我的程序中,守护进程具有std输入和std输出std err。所以我像下面那样改变我的python守护进程,事情像一个咒语一样工作:

if __name__ == '__main__':
    # do the UNIX double-fork magic, see Stevens' "Advanced
    # Programming in the UNIX Environment" for details (ISBN 0201563177)

    try:
        pid = os.fork()
        if pid > 0:
            # exit first parent
            os._exit(0)
    except OSError, e:
        print "fork #1 failed: %d (%s)" % (e.errno, e.strerror)
        os._exit(0)
    # decouple from parent environment
    #os.chdir("/")
    os.setsid()
    os.umask(0)
    #std in out err, redirect
    si = file('/dev/null', 'r')
    so = file('/dev/null', 'a+')
    se = file('/dev/null', 'a+', 0)
    os.dup2(si.fileno(), sys.stdin.fileno())
    os.dup2(so.fileno(), sys.stdout.fileno())
    os.dup2(se.fileno(), sys.stderr.fileno())
    # do second fork
    while(True):
        try:
            pid = os.fork()
            if pid == 0:
                serve()
            if pid > 0:
                print "Server PID %d, Daemon PID: %d" % (pid, os.getpid())
                os.wait()
                time.sleep(3)
        except OSError, e:
            #print "fork #2 failed: %d (%s)" % (e.errno, e.strerror)
            os._exit(0)