在 Dokku 上部署 Rails 时出错 - 在 Digital Ocean

Dan*_*l D 6 ruby-on-rails dokku

我正在尝试使用示例 Rails 应用程序在 DigitalOcean 上运行 dokku,但是当我部署时,出现此错误:

      Puma starting in single mode...
       * Version 3.12.1 (ruby 2.6.3-p62), codename: Llamas in Pajamas
       * Min threads: 5, max threads: 5
       * Environment: production
       * Listening on tcp://0.0.0.0:5000
       bundler: failed to load command: rackup (/app/vendor/bundle/ruby/2.6.0/bin/rackup)
       Errno::ENOENT: No such file or directory @ rb_sysopen - tmp/pids/server.pid
         /app/vendor/bundle/ruby/2.6.0/gems/puma-3.12.1/lib/puma/launcher.rb:133:in `initialize'
         /app/vendor/bundle/ruby/2.6.0/gems/puma-3.12.1/lib/puma/launcher.rb:133:in `open'
         /app/vendor/bundle/ruby/2.6.0/gems/puma-3.12.1/lib/puma/launcher.rb:133:in `write_pid'
         /app/vendor/bundle/ruby/2.6.0/gems/puma-3.12.1/lib/puma/launcher.rb:106:in `write_state'
         /app/vendor/bundle/ruby/2.6.0/gems/puma-3.12.1/lib/puma/single.rb:103:in `run'
         /app/vendor/bundle/ruby/2.6.0/gems/puma-3.12.1/lib/puma/launcher.rb:186:in `run'
         /app/vendor/bundle/ruby/2.6.0/gems/puma-3.12.1/lib/rack/handler/puma.rb:73:in `run'
         /app/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/server.rb:297:in `start'
         /app/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/server.rb:148:in `start'
         /app/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/bin/rackup:4:in `<top (required)>'
         /app/vendor/bundle/ruby/2.6.0/bin/rackup:23:in `load'
         /app/vendor/bundle/ruby/2.6.0/bin/rackup:23:in `<top (required)>'

Run Code Online (Sandbox Code Playgroud)

我查看了其他支持站点是否有类似的错误 - 但看起来 web 应用程序容器启动然后立即停止。

我可以看到我的数据库容器正在运行,我看到一个带有dokkku/myapp:latest-的容器,并且它的运行时间永远不会超过几秒钟。

任何人都知道为什么?

Cal*_*leb 6

Rails 6 添加了一行来config/puma.rb指定 pidfile 的位置(在我撰写本文时,默认为第 20 行),默认值如下:

pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
Run Code Online (Sandbox Code Playgroud)

我遇到了你提到的同样问题,并通过将该行更改为

pidfile ENV.fetch("PIDFILE") { "server.pid" }
Run Code Online (Sandbox Code Playgroud)

tmp从两者.gitignore.dockerignore(在我的情况下,因为我的应用程序是 Dockerized)中删除目录也有效,但是tmp在 git 和我的生产容器中使用目录闻起来很有趣,所以我选择了上述方法。

不管怎样,我很高兴你让它工作了!... 希望这可以帮助

PS - 您可能需要考虑选择这些答案之一作为正确答案(即使它是您提供的答案) 快乐编码!


Dan*_*l D 0

不知道为什么这是一个问题 - 但我的 .gitignore 文件(我认为是默认值)保留了 /tmp 文件夹,但忽略了内容,因此存储库中没有 /tmp/pids,并且可能没有在网络容器上。

我将 /tmp/pids 文件夹强制放入存储库中...现在它可以工作了!