脚本后无法 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
提到了保持容器打开的解决方法
我无法获取 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
提到了保持容器打开的解决方法