【问题标题】:Cannot return to shell session after script脚本后无法返回 shell 会话
【发布时间】: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


【解决方案1】:
#!/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

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

【讨论】:

  • 这似乎工作,除了容器退出我推测是因为脚本完成,因此 bash (PID 1) 终止,然后 Docker 守护进程停止......
  • @AVProgrammer:见this question
  • 感谢@sjsam 我决定以 PID 1 运行 supervisord 并使用 /etc/supervisord.conf(有用的 include 指令)启动 init.sh 启动的脚本(使用特定于进程的配置) .谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 2016-03-14
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多