脚本后无法 return 到 shell 会话

Cannot return to shell session after script

我无法获取 return 到 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

init 脚本按预期运行(我在 /etc/postfix/init.d/ 目录中看到脚本的输出并且 supervisord 启动了 Postfix。

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

如果我在 init.sh 脚本末尾停止对 bash 的调用,Ctrl+D 会退出脚本和容器,return 将我发送到主机 OS(osx)。如果我用 exit 替换 bash 调用,它也会 return 发送给主机 OS。

supervisord 是否按照预期的方式运行,运行 以这种方式出现在前台?我希望能够轻松地返回到容器 shell 会话以检查事情是否 运行。我是否需要 Ctrl+D(进入辅助 bash 会话)才能执行此操作?

更新 马克 B

take out the bash line, so you don't start a new shell. and if supervisord doesn't go into the background automatically, you could try running it with & to force it into the background, or maybe there's an extra cli option to force it to go into daemon mode

我已经尝试删除对 bash 的最后一次调用,但正如我所提到的,它仍然在那里,Ctrl+D 将我带到主机 OS(退出容器).

我刚刚尝试了 /usr/bin/supervisord -c /etc/supervisord.conf &(并在最后停止了对 bash 的调用)并且它立即 returns 到主机 OS,退出了容器.我假设是因为容器没有任何剩余 "do",所以停止了。

#!/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

最后你陷入了 child bash shell :(

现在,如果您不返回父级 shell,您的最后一个命令 运行 就是罪魁祸首。

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

您可以通过

在后台强制命令运行
/usr/bin/supervisord -c /etc/supervisord.conf & #the & tells to run in background

提到了保持容器打开的解决方法