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

Can't run puma in daemon mode in docker

我有一个 rails5 应用程序并使用 puma 作为它的网络服务。正常环境下部署没问题,docker守护进程部署就失败了。我将列出我可以做什么和不能做什么如下:

可以:

rails s 没有 docker

puma 没有 docker

puma --daemon 没有 docker

puma -C config/puma.rb without docker # in which set daemon: true

puma 在 docker

不能:

docker

中的`puma --daemon'

puma -C config/puma.rb in docker in which set daemon: true


结论是我不能在 docker 中使用守护程序模式 运行 puma,当我使用 docker-compose up 命令时 returns:

Puma starting in single mode...

  • Version 3.8.2 (ruby 2.4.0-p0), codename: Sassy Salamander
  • Min threads: 5, max threads: 5
  • Environment: production
  • Daemonizing...
  • website_1 exited with code 0

没有任何其他信息。

那么,到底发生了什么?

Docker 容器 运行 单个进程。当该过程完成时,容器退出。了解了这一点,让我们来看看 puma --daemon 选项的作用。

Puma 的帮助输出显示:

-d, --daemon Daemonize the server into the background

当您执行此操作时,Puma 会将自己分叉到后台。此时父进程完成并退出。这是 Docker 知道的实际过程。由于此过程完成并退出,因此容器退出。

要在容器中 运行 Puma,您需要在没有守护进程选项的情况下在前台 运行。

编辑:我找到了 Process.daemon 方法如何在 Ruby 中工作的很好的解释(Puma 在 https://github.com/puma/puma/blob/f5f23aaac7aaccff1b6b138d93dd4b1755ebf1c2/lib/puma/daemon_ext.rb) in https://www.jstorimer.com/blogs/workingwithcode/7766093-daemon-processes-in-ruby.

中使用的方法)