【发布时间】:2016-08-14 21:32:29
【问题描述】:
我无法获得返回 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 脚本结束时停止对 bash 的调用,Ctrl+D 将退出脚本和容器,将我返回到主机操作系统 (osx)。如果我将bash 调用替换为exit,它也会返回到主机操作系统。
supervisord 是否以这种方式在前台运行?我希望能够轻松地回到容器 shell 会话以检查事情是否正在运行。我是否需要 Ctrl+D(进入辅助 bash 会话)才能执行此操作?
更新 马克·B
取出 bash 行,这样你就不会启动新的 shell。而如果 supervisord 不会自动进入后台,你可以 尝试使用 & 运行它以强制它进入后台,或者也许 有一个额外的 cli 选项可以强制它进入守护程序模式
我已尝试删除对 bash 的最后一次调用,但正如我所提到的,它仍然存在,并且 Ctrl+D 将我带到主机操作系统(退出容器)。
我刚刚尝试了/usr/bin/supervisord -c /etc/supervisord.conf &(并在最后停止了对bash 的调用),它立即返回到主机操作系统,退出容器。我假设是因为容器没有什么可“做”的,所以停止了。
【问题讨论】:
-
如果你想回到 parentl shell 提示符,你为什么要在脚本末尾启动一个新的 bash?这会把你踢进那个孩子的狂欢,而不是父母的狂欢。
-
是的,我如何回到父级?
-
去掉
bash这一行,这样你就不用启动一个新的shell了。如果 supervisord 没有自动进入后台,你可以尝试使用&强制它进入后台,或者可能有一个额外的 cli 选项强制它进入守护模式
标签: linux bash docker supervisord alpine