我无法让脚本返回 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。
问题是让脚本返回到父进程 (bash),而不是需要启动一个新进程。在它命中supervisord
会话将驻扎在那里,需要 Ctrl+C 才能使其返回到bash
提示符。
如果我在init.sh
脚本结束时关闭对bash
的调用,Ctrl+D 将退出脚本和容器,将我返回到主机操作系统 (osx)。如果我将bash
调用替换为 exit
,它也会返回到主机操作系统。
supervisord
的行为方式是否应该按照它应该的方式,以这种方式在前台运行?我希望能够轻松返回容器外壳会话以检查是否正在运行。我是否需要按 Ctrl+D(进入辅助bash
会话)才能执行此操作?
更新马克
·取出 bash 线,这样你就不会启动一个新的外壳。 如果 主管不会自动进入后台,您可以 尝试运行它 & 以强制它进入后台,或者可能 有一个额外的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
最后,你被困在一个儿童狂欢的外壳:(
现在,如果您不返回到父 shell,则您运行的最后一个命令是罪魁祸首。
/usr/bin/supervisord -c /etc/supervisord.conf
您可以通过以下方式强制命令在后台运行
/usr/bin/supervisord -c /etc/supervisord.conf & #the & tells to run in background
此处提到了保持容器打开的解决方法