Сервер Puma внутри контейнера heroku не может подключиться к порту - PullRequest
0 голосов
/ 20 марта 2019

У меня есть докер-контейнер: (называемый 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, приложение разворачивается, но сервер puma не запускается, т.к. порт не может быть подключен:

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'

Где может быть моя ошибка?Есть идеи?

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Для людей, прибывших сюда, решение состояло в том, чтобы вызвать сервер puma непосредственно из докера CMD, чтобы были применены все настройки в файле конфигурации. Причина в том, что на герою такие вещи, как порт, добавляются динамически, поэтому образы контейнеров (которые были созданы ранее) не будут иметь этих образов. Каким-то образом использование значений $PORT внутри Dockerfile также не помогло. Решение было сделать

CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]

# or if you prefer the bash style
CMD bundle exec puma -C config/puma.rb
0 голосов
/ 20 марта 2019

Я не уверен, почему вы пропустили эту часть:

port        ENV['PORT']     || 3000

Вы не можете выбрать свой собственный порт. Используйте $PORT, который Героку дает вам .

...