脚本后不能返回到shell会话

我不能得到一个脚本返回到bash。

该脚本通过以下Docker指令启动:

ENTRYPOINT ["/bin/bash", "-c"] CMD ["set -e && /config/startup/init.sh"] 

初始化脚本如下所示:

 #!/bin/bash if [ -d /etc/postfix/init.d ]; then for f in /etc/postfix/init.d/*.sh; do [ -f "$f" ] && . "$f" done fi echo "[x] Starting supervisord ..." /usr/bin/supervisord -c /etc/supervisord.conf bash 

这是我用来启动映像到一个容器的命令:

 docker run -it --env-file ENV_LOCAL mailrelay 

初始化脚本按预期运行(我可以看到/etc/postfix/init.d/目录下的脚本输出,并且supervisord启动了Postfix。

问题是让脚本返回到父进程(bash)而不是需要启动一个新的。 在点击supervisord ,会话就在那里,需要一个Ctrl + C来让它回到bash提示符。

如果我在init.sh脚本结束时不init.sh bash ,Ctrl + D退出脚本和容器,将我返回到主机操作系统(osx)。 如果我用exitreplacebash调用,它也会返回到主机操作系统。

supervisord是否按照预期的方式运行,通过这种方式在前台运行? 我希望能够轻松地回到容器shell会话来检查是否正在运行。 我是否需要Ctrl + D(进入辅助bash会话)才能做到这一点?

更新马克乙

拿出bash行,所以你不会启动一个新的shell。 如果supervisord没有自动进入后台,你可以试着用&强制它进入后台,或者有一个额外的cli选项来强制它进入守护进程模式

我已经尝试删除最后一次调用bash ,但正如我刚才提到的,它只是坐在那里,Ctrl + D带我到主机操作系统(退出容器)。

我只是尝试了/usr/bin/supervisord -c /etc/supervisord.conf & (并在最后停止了对bash的调用),并立即返回到主机操作系统,退出容器。 我假设,因为容器没有什么可以“做”,所以停下来。

 #!/bin/bash if [ -d /etc/postfix/init.d ]; then for f in /etc/postfix/init.d/*.sh; do [ -f "$f" ] && . "$f" done fi echo "[x] Starting supervisord ..." /usr/bin/supervisord -c /etc/supervisord.conf one bash # You are spawning a new bash shell here. Remove this statement 

最后,你的卡在一个孩子的 bash壳:(

现在如果你没有返回到父shell,你运行的最后一个命令是罪魁祸首。

 /usr/bin/supervisord -c /etc/supervisord.conf 

您可以强制命令在后台运行

 /usr/bin/supervisord -c /etc/supervisord.conf & #the & tells to run in background 

这里提到了一个解决方法来保持容器打开