我有一个rails5应用程序并使用puma作为它的Web服务。可以在普通环境中部署它,但在使用守护程序模式在docker中部署它时失败。我将列出我能做什么以及我不能做的事情如下:
可以:
没有泊坞窗的 RefCell
rails s
puma
puma --daemon
没有docker#,其中set daemon:true
puma -C config/puma.rb
不能:
在码头工人中`puma - daemon'
docker中的 puma
,其中set daemon:true
结论是我无法在具有守护进程模式的docker中运行puma,当我使用puma -C config/puma.rb
命令时它返回:
Puma以单一模式开始......
- 版本3.8.2(ruby 2.4.0-p0),代号:Sassy Salamander
- 最小线程:5,最大线程数:5
- 环境:生产
- Daemonizing ...
- website_1退出,代码为0
没有任何其他信息。
那么,它究竟发生了什么?
答案 0 :(得分:3)
Docker容器运行单个进程。该过程完成后,容器退出。知道了这一点,让我们来看看puma --daemon
选项的作用。
Puma的帮助输出说:
-d, - damon将服务器守护进入后台
当你这样做时,Puma正在将自己逼入背景中。此时父进程已完成并退出。这是Docker知道的实际过程。由于此过程已完成并退出,因此容器将退出。
要在容器中运行Puma,您需要在没有守护程序选项的情况下在前台运行。
编辑:我在https://github.com/puma/puma/blob/f5f23aaac7aaccff1b6b138d93dd4b1755ebf1c2/lib/puma/daemon_ext.rb中找到了Process.daemon
方法在Ruby(Puma在https://www.jstorimer.com/blogs/workingwithcode/7766093-daemon-processes-in-ruby使用的)中如何工作的一个很好的解释。