1
0

More than 1 year has passed since last update.

dockerでデバッグしようにもdocker attachでコンソールが出力されず、pumaのログも出力されない件

Posted at

発生した問題

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

記述が間違っていると考えられるソースコードを以下に記す。

docker compose.yml(一部抜粋)
version: '3'
services:
  app:
    build:
      context: .
# =========ローカルと本番切り替え===========
    #command: bundle exec puma -C config/puma.rb -e production
    command: bundle exec puma -C config/puma.rb
# ======================================
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

解決策

docker compose.yml(一部抜粋)
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'"

と変更することした。こちらリサーチ不足でなぜこれで上手くいったかわかっていないため分かり次第編集します。

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

このコードにより、標準出力/標準エラーを出力するファイルが予期せぬところに出力され、ログが出力されないと仮定し削除したところpumaがログを吐くようになり、結果docker attachでコンソールを表示し、デバッグすることができました。めでたし、めでたし。
何か間違っている点ありましたら指摘のほどよろしくお願いします。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0