発生した問題
dockerの開発環境上でデバッグをするためにbinding.pryを置いて画面遷移したがpumaのログを吐かないため、binding.pryの所で処理が止まっているか確認出来ず、又docker attachでrailsが動いているコンテナにアタッチしてもコンソールが表示されない。
前提
貼りたいyoutubeの動画のurlをmovieモデルのmovie_urlカラムにform_withを用いて保存したい。
userモデルが親、movieモデルが子のリレーションをしている。
しかし、上手く保存出来ずこれが何故かを調べるためにデバッグしようとしたところ今回の問題が発生という流れ。
実際の問題コード
docker compose upでサーバーを起動は出来るが、それ以降サイトを読み込んでも以下のログから一向に変化なし。なぜ?
app_1 | => Booting Puma
app_1 | => Rails 7.0.4 application starting in development
app_1 | => Run `bin/rails server --help` for more startup options
app_1 | Puma starting in single mode...
app_1 | * Puma version: 5.6.5 (ruby 3.1.1-p18) ("Birdie's Version")
app_1 | * Min threads: 5
app_1 | * Max threads: 5
app_1 | * Environment: development
app_1 | * PID: 1
app_1 | * Listening on http://0.0.0.0:3000
app_1 | Use Ctrl-C to stop
記述が間違っていると考えられるソースコードを以下に記す。
version: '3'
services:
app:
build:
context: .
# =========ローカルと本番切り替え===========
#command: bundle exec puma -C config/puma.rb -e production
command: bundle exec puma -C config/puma.rb
# ======================================
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i
threads threads_count, threads_count
port ENV.fetch("PORT") { 3000 }
environment ENV.fetch("RAILS_ENV") { "development" }
plugin :tmp_restart
app_root = File.expand_path("../..", __FILE__)
bind "unix://#{app_root}/tmp/sockets/puma.sock"
stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true
解決策
version: '3'
services:
app:
tty: true
stdin_open: true
build:
context: .
# =========ローカルと本番切り替え===========
#command: bundle exec puma -C config/puma.rb -e production
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
# ======================================
解説
tty: true
stdin_open: true
docker attachでコンテナの外から命令するために必要とのことで追加しました。
続いて
command: bundle exec puma -C config/puma.rb
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
と変更することした。こちらリサーチ不足でなぜこれで上手くいったかわかっていないため分かり次第編集します。
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i
threads threads_count, threads_count
port ENV.fetch("PORT") { 3000 }
environment ENV.fetch("RAILS_ENV") { "development" }
plugin :tmp_restart
app_root = File.expand_path("../..", __FILE__)
bind "unix://#{app_root}/tmp/sockets/puma.sock"
解説
➖stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true
このコードにより、標準出力/標準エラーを出力するファイルが予期せぬところに出力され、ログが出力されないと仮定し削除したところpumaがログを吐くようになり、結果docker attachでコンソールを表示し、デバッグすることができました。めでたし、めでたし。
何か間違っている点ありましたら指摘のほどよろしくお願いします。