1

我无法获得返回 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提示状态。

bash如果我在脚本末尾停止调用 to init.sh,Ctrl+D 退出脚本和容器,将我返回到主机操作系统 (osx)。如果我bashexit,它也会返回到主机操作系统。

supervisord通过这种方式在前台运行,是否表现得像它应该的那样?我希望能够轻松地回到容器 shell 会话以检查事情是否正在运行。我是否需要 Ctrl+D (进入二级bash会话)才能执行此操作?

更新 马克 B

取出 bash 行,这样你就不会启动新的 shell。如果 supervisord 没有自动进入后台,您可以尝试使用 & 强制它进入后台运行它,或者可能有一个额外的 cli 选项强制它进入守护程序模式

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

我刚刚尝试过/usr/bin/supervisord -c /etc/supervisord.conf &(并在最后停止调用bash),它立即返回主机操作系统,退出容器。我假设是因为容器没有什么可以“做”,所以停止了。

4

1 回答 1

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

最后你被困在一个儿童bash shell 中:(

现在,如果您没有返回到父 shell,那么您运行的最后一个命令就是罪魁祸首。

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

您可以通过以下方式强制命令在后台运行

/usr/bin/supervisord -c /etc/supervisord.conf & #the & tells to run in background

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

于 2016-04-21T15:31:13.777 回答