如何在后台启动 php 服务器作为 docker 容器中的守护进程
How do I start a php server in the background as a daemon in a docker container
我试图使用 upStart (Run php script as daemon process) 遵循这里的教程,但是当我收到错误 'startserver: unrecognized service'
时,我 运行 遇到了一些障碍
这里有一些图片展示了我的尝试
控制台底部是错误所在。我还证明我的文件在 /etc/init 中,它应该在 docker 容器中。我使用 docker exec -it draftandpermit_web_1 bash
登录
我是不是漏掉了什么?
其他参考资料:
startserver.conf
# Info
description "Start Server"
author "Joseph Astrahan"
# Events
start on startup
stop on shutdown
# Automatically respawn
respawn
respawn limit 20 5
# Run the script!
# Note, in this example, if your PHP script returns
# the string "ERROR", the daemon will stop itself.
script
[ $(exec /usr/bin/php -f /var/www/callcenter/livesite/bin/startwebsocketserver.php) = 'ERROR' ] && ( stop; exit 1; )
end script
我要么像你在图片中看到的那样手动激活它,要么使用我的便捷脚本
echo "Copying startserver.conf to /etc/init"
docker exec -it draftandpermit_web_1 bash -c "cd /app/docker; cp -f startserver.conf /etc/init/"
echo "Stopping & Starting the WebSocket & HTTP Server"
docker exec -it draftandpermit_web_1 bash -c "service startserver stop"
docker exec -it draftandpermit_web_1 bash -c "service startserver start"
请记住文件所在的路径是正确的,因为我手动进入容器查看 /etc/init,如图所示。
Docker 既不是 init 系统,也不是 运行 没有一些 hack 的传统 init 系统。 运行 在 Docker 容器中的第一个进程将是 PID 1。这可能是一个主管(如 supervisord、s6、dumb-init)。
但是,更一般地说,您可以 运行 您想要的进程并使用 docker run
命令的选项在前台或后台处理 运行ning。在此示例中,您的 Docker 命令(或 Dockerfile
中的 CMD
)可以只是 php -f /var/www/callcenter/livesite/bin/startwebsocketserver.php
。然后,运行 您的带有 -d
选项的容器,它将在后台 运行。您可以使用 docker attach
附加到它,或者只使用 docker logs
.
观察输出
如果您确实需要使用某种进程主管(例如,当您需要在容器中有多个进程 运行ning 时),那么我会开始寻找 Docker初始化选项在那里。我提到了几个,还有更多。 Upstart 无法在容器内工作。
我试图使用 upStart (Run php script as daemon process) 遵循这里的教程,但是当我收到错误 'startserver: unrecognized service'
这里有一些图片展示了我的尝试
控制台底部是错误所在。我还证明我的文件在 /etc/init 中,它应该在 docker 容器中。我使用 docker exec -it draftandpermit_web_1 bash
我是不是漏掉了什么?
其他参考资料:
startserver.conf
# Info
description "Start Server"
author "Joseph Astrahan"
# Events
start on startup
stop on shutdown
# Automatically respawn
respawn
respawn limit 20 5
# Run the script!
# Note, in this example, if your PHP script returns
# the string "ERROR", the daemon will stop itself.
script
[ $(exec /usr/bin/php -f /var/www/callcenter/livesite/bin/startwebsocketserver.php) = 'ERROR' ] && ( stop; exit 1; )
end script
我要么像你在图片中看到的那样手动激活它,要么使用我的便捷脚本
echo "Copying startserver.conf to /etc/init"
docker exec -it draftandpermit_web_1 bash -c "cd /app/docker; cp -f startserver.conf /etc/init/"
echo "Stopping & Starting the WebSocket & HTTP Server"
docker exec -it draftandpermit_web_1 bash -c "service startserver stop"
docker exec -it draftandpermit_web_1 bash -c "service startserver start"
请记住文件所在的路径是正确的,因为我手动进入容器查看 /etc/init,如图所示。
Docker 既不是 init 系统,也不是 运行 没有一些 hack 的传统 init 系统。 运行 在 Docker 容器中的第一个进程将是 PID 1。这可能是一个主管(如 supervisord、s6、dumb-init)。
但是,更一般地说,您可以 运行 您想要的进程并使用 docker run
命令的选项在前台或后台处理 运行ning。在此示例中,您的 Docker 命令(或 Dockerfile
中的 CMD
)可以只是 php -f /var/www/callcenter/livesite/bin/startwebsocketserver.php
。然后,运行 您的带有 -d
选项的容器,它将在后台 运行。您可以使用 docker attach
附加到它,或者只使用 docker logs
.
如果您确实需要使用某种进程主管(例如,当您需要在容器中有多个进程 运行ning 时),那么我会开始寻找 Docker初始化选项在那里。我提到了几个,还有更多。 Upstart 无法在容器内工作。