我正在尝试从 dockerfile 中的脚本运行 apache2 服务.sh
。'sh' 脚本包含 3 个可执行命令,如下所示:
#!/bin/bash
export DISPLAY=:0.0
echo "pvw launcher file execution started"
/home/data/pv/pv-5.9.0/bin/pvpython /home/data/pvw/conf/launcher.json &
echo "pvw launcher file execution done"
echo "Apache2 frontend exectution"
exec apachectl -D FOREGROUND
echo "Starting gunicorn"
exec python -m gunicorn --bind 172.17.0.2:9002 --keep-alive 100 --log-file temp.txt --log-level debug --timeout 600 wsgi:app
基于此,dockerfile中的CMD呈现为CMD ./start.sh
。
现在,当我运行 docker 镜像时,容器运行到 apache2 并将终端保留在那里。
我希望容器执行 apache2 服务,持续运行并转到“sh”脚本中的下一个命令(gunicorn)并执行 gunicorn 命令。我应该如何修改“sh”脚本?
答案1
您正在前台执行 Apache HTTPd,因此它正在执行您要求它执行的操作。您想要执行的操作是守护进程Apache,因此脚本执行可以继续。
如何操作取决于您(或您的发行版)设置 Apache 的方式,但通常可以执行以下操作:
apachectl start
代替apachectl -D FOREGROUND
。
请注意,通过守护进程,您将失去与 Docker 进程的父子关系,因此诸如此类的事情docker stop
可能会停止工作或等到超时后再终止 Apache。此外,如果 Apache 死亡,Docker 不会注意到,也不会自动重新启动容器。
更好的解决方案是将 Apache 和 Gunicorn 放在单独的 Docker 容器中。如果出于某种原因无法做到这一点,请使用某些进程管理器来supervisord
管理容器内的进程。