【问题标题】:Error Deploying Rails on Dokku - on Digital Ocean在 Dokku 上部署 Rails 时出错 - 在 Digital Ocean 上
【发布时间】:2019-09-03 02:08:10
【问题描述】:

我正在尝试使用示例 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)>'

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

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

有人知道为什么吗?

【问题讨论】:

    标签: ruby-on-rails dokku


    【解决方案1】:

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

    pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
    

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

    来解决它
    pidfile ENV.fetch("PIDFILE") { "server.pid" }
    

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

    不管怎样,我很高兴你能成功! ...希望这会有所帮助

    PS - 您可能需要考虑选择其中一个答案是正确的(即使它是您提供的答案)祝您编码愉快!

    【讨论】:

    • 仅供参考 - 我并不是说你应该检查 contents - 只是为了在那里有结构。现在这是否太过分了? - 我可以看到这个问题的双方 - PIDS 位于 tmp 文件夹中是有意义的。我可能会说 Rails 不应该规定从 repos 中排除的文件夹的结构。
    【解决方案2】:

    tmp/pids/server.pid 是 Rails 用来检查它是否已经在运行以及检查它正在运行的进程 ID 的文件。

    带有 Dokku 的 IIRC,有一个名为 dokku 的用户,所有 Dokku 进程都在该用户下运行 - 确保该用户(或运行 Dokku/Rails 应用程序的任何用户)对该目录具有读/写权限。

    或者,您也可以调用 touch tmp/pids/server.pid 来创建文件,以便 Rails 可以使用它。

    【讨论】:

    • 我在 Digital Ocean 上将其设置为一键式设置 - 并且没有给“dokku”用户任何特殊权限 - 该用户是否应该以管理员身份运行? -- 谢谢,我从没想过这可能是权限问题。
    【解决方案3】:

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

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

    【讨论】:

    • 很高兴你得到它的工作伙伴!不过,您可能不希望将 /tmp 文件夹提交到 repo - 根据定义,它是不一致的文件。 pids 文件在本地和服务器上会有所不同,并且每次运行应用程序时都会有所不同。如果您这样做,您在部署应用程序时可能会遇到问题。
    • 仅供参考 - 不将 tmp 文件夹添加到 repo,只是 /tmp/pids 的空文件夹,并且不签入任何内容。
    猜你喜欢
    • 2015-02-22
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2014-01-25
    • 2017-01-25
    • 1970-01-01
    相关资源
    最近更新 更多