在docker中无法在守护进程模式下运行puma

时间:2017-07-03 02:21:14

标签: ruby-on-rails docker docker-compose daemon puma

我有一个rails5应用程序并使用puma作为它的Web服务。可以在普通环境中部署它,但在使用守护程序模式在docker中部署它时失败。我将列出我能做什么以及我不能做的事情如下:

可以:

没有泊坞窗的

RefCell

没有泊坞窗的

rails s

没有泊坞窗的

puma

puma --daemon没有docker#,其中set daemon:true

docker中的

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
  •   

没有任何其他信息。

那么,它究竟发生了什么?

1 个答案:

答案 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使用的)中如何工作的一个很好的解释。