在 Dokku 上部署 Rails 时出错 - 在 Digital Ocean 上
Error Deploying Rails on Dokku - on Digital Ocean
我正在尝试使用示例 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 应用程序容器启动然后立即停止。
我可以看到我的数据库容器 运行ning,并且我看到一个带有 dokkku/myapp:latest
的容器 - 而且它不会启动超过几秒钟。
有人知道为什么吗?
tmp/pids/server.pid
是文件 Rails 用来检查它是否已经 运行ning,并检查它是什么进程 ID 运行。
IIRC with Dokku,有一个名为 dokku
的用户,所有 Dokku 都在 运行 下处理 - 确保用户(或任何用户 Dokku/the Rails 应用程序是运行ning 下), 对该目录具有 read/write 权限。
或者,您可以只调用 touch tmp/pids/server.pid
来创建文件,以便 Rails 可以使用它。
不确定为什么这是个问题 - 但我的 .gitignore 文件(我认为是默认文件)保留了 /tmp 文件夹,但忽略了内容,因此回购中没有 /tmp/pids,网络容器上可能没有。
我将 /tmp/pids 文件夹强制放入存储库中...现在可以使用了!
Rails6 在config/puma.rb
中添加了一行指定pidfile的位置(默认第20行,在我写这篇文章的时候),默认值如下:
pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
我 运行 遇到了你提到的同一个问题,并通过将该行更改为
来解决它
pidfile ENV.fetch("PIDFILE") { "server.pid" }
从 .gitignore
和 .dockerignore
中删除 tmp
目录(在我的例子中,因为我的应用程序是 Dockerized)也有效,但是 tmp
目录在 git 并且在我的生产容器上闻起来很奇怪,所以我选择了上述方法。
不管怎样,我很高兴你成功了! ...希望这有帮助
PS - 您可能需要考虑选择其中一个答案是正确的(即使这是您提供的答案)编码愉快!
我正在尝试使用示例 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 应用程序容器启动然后立即停止。
我可以看到我的数据库容器 运行ning,并且我看到一个带有 dokkku/myapp:latest
的容器 - 而且它不会启动超过几秒钟。
有人知道为什么吗?
tmp/pids/server.pid
是文件 Rails 用来检查它是否已经 运行ning,并检查它是什么进程 ID 运行。
IIRC with Dokku,有一个名为 dokku
的用户,所有 Dokku 都在 运行 下处理 - 确保用户(或任何用户 Dokku/the Rails 应用程序是运行ning 下), 对该目录具有 read/write 权限。
或者,您可以只调用 touch tmp/pids/server.pid
来创建文件,以便 Rails 可以使用它。
不确定为什么这是个问题 - 但我的 .gitignore 文件(我认为是默认文件)保留了 /tmp 文件夹,但忽略了内容,因此回购中没有 /tmp/pids,网络容器上可能没有。
我将 /tmp/pids 文件夹强制放入存储库中...现在可以使用了!
Rails6 在config/puma.rb
中添加了一行指定pidfile的位置(默认第20行,在我写这篇文章的时候),默认值如下:
pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
我 运行 遇到了你提到的同一个问题,并通过将该行更改为
来解决它pidfile ENV.fetch("PIDFILE") { "server.pid" }
从 .gitignore
和 .dockerignore
中删除 tmp
目录(在我的例子中,因为我的应用程序是 Dockerized)也有效,但是 tmp
目录在 git 并且在我的生产容器上闻起来很奇怪,所以我选择了上述方法。
不管怎样,我很高兴你成功了! ...希望这有帮助
PS - 您可能需要考虑选择其中一个答案是正确的(即使这是您提供的答案)编码愉快!