如何让 apache 服务从 docker 的脚本文件持续运行?

如何让 apache 服务从 docker 的脚本文件持续运行?

我正在尝试从 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管理容器内的进程。

相关内容