我有一个docker容器:(称为 Dockerfile.web
,相关零件)
ARG PORT=3000
ENV PORT=$PORT
EXPOSE $PORT
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["rails", "server"]
puma: config/puma.rb
before_fork do
ActiveRecord::Base.connection_pool.disconnect! if defined? ActiveRecord
end
on_worker_boot do
ActiveRecord::Base.establish_connection if defined? ActiveRecord
end
preload_app!
因此,当我运行heroku container:push web
之后是heroku container:release web
时,App部署,但是PUMA服务器不会出现B/C,端口不能连接到:
Booting Puma
Rails 5.2.2 application starting in development
Run `rails server -h` for more startup options
Puma starting in cluster mode...
* Version 3.12.0 (ruby 2.6.0-p0), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Process workers: 1
* Preloading application
* Listening on tcp://localhost:41626
Use Ctrl-C to stop
- Worker 0 (pid: 28) booted, phase: 0
Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
Stopping process with SIGKILL
我遵循官方指南,但我没有添加这些部分:
rackup DefaultRackup
port ENV['PORT'] || 3000
environment ENV['RACK_ENV'] || 'development'
我的错误在哪里?有什么想法吗?
我不确定为什么您将此部分遗漏:
port ENV['PORT'] || 3000
您无法选择自己的端口。使用Heroku给您的$PORT
。
对于到达此处的人们,解决方案是直接从Docker CMD
调用PUMA服务器,以便应用配置文件中的所有设置。原因是在Heroku上,诸如端口之类的内容是动态添加的,因此容器图像(前面构建)将没有这些图像。以某种方式使用dockerfile中的$PORT
值也无济于事。解决方案是做
CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]
# or if you prefer the bash style
CMD bundle exec puma -C config/puma.rb