我有一个rails5应用程序,并使用Puma作为Web服务。在正常环境中部署它没问题,但在带有守护程序模式的 docker 中部署它时失败。我将列出我能做什么和我不能做什么,如下所示:
能:
rails s
没有码头工人
没有码头工人的puma
没有码头工人的puma --daemon
puma -C config/puma.rb
没有 docker # 其中设置守护程序:true
puma
在码头工人
不能:
Docker中的"Puma --Daemon">
puma -C config/puma.rb
docker 中设置守护程序:true
结论是我无法使用守护程序模式在 docker 中运行 puma,当我使用docker-compose up
命令时,它会返回:
彪马以单模式开始...
- 版本 3.8.2(红宝石 2.4.0-p0(,代号:时髦蝾螈
- 最小线程数: 5, 最大线程数: 5
- 环境:生产
- 守护进程...
- website_1以代码 0 退出
没有任何其他信息。
那么,它到底发生了什么?
Docker 容器运行单个进程。该过程完成后,容器将退出。知道了这一点,让我们来看看puma --daemon
选项的作用。
彪马的帮助输出说:
-d, --daemon 将服务器守护进程到后台
当你这样做时,彪马正在将自己分叉到后台。此时,父进程已完成并退出。这是Docker知道的实际过程。由于此过程已完成并退出,因此容器将退出。
要在容器中运行 Puma,您需要在没有守护程序选项的情况下在前台运行。
编辑:我在 https://www.jstorimer.com/blogs/workingwithcode/7766093-daemon-processes-in-ruby 中找到了关于Process.daemon
方法如何在Ruby(Puma在 https://github.com/puma/puma/blob/f5f23aaac7aaccff1b6b138d93dd4b1755ebf1c2/lib/puma/daemon_ext.rb 使用(中工作的很好的解释。