質問: Rails の docker コンテナを作って Dockerfile 内に ``` CMD bash -c "rm -f /home/git/rails_test/tmp/pids/server.pid && bundle exec rails s -b '0.0.0.0'" ``` とかいて起動でき、ホスト上からブラウザで Rails の画面にアクセスできたんですが この状態で Rails が標準出力にはく色付きのログを参照する方法はありませんか? RAILS_ROOT/logs/development.log にはたまるんですが 色がついてなくてわかりにくいし Logger メソッドを使わないとログにたまらないので puts だけで標準出力にはいて手軽にデバッグしたいです --- そこで Rails を自動起動せずにコンテナに入って手動で入ってから ``` bundle exec rails s -b '0.0.0.0' ``` をしようと思い、docker-compose.yml に ``` command: /bin/bash ``` と書いて docker-compose up -d を実行し直したところまた STATUS が `Restarting (0) 31 seconds ago` となるのを繰り返して `docker exec -it /bin/bash` でコンテナに入ることができません docker logs にも何も出力されないので何が原因で起動に失敗してるのかもわかりません どうすればいいかお知恵をお返しいただけないでしょうか
回答: Railsのログを標準出力に出す Railsの設定ファイルで,ログを標準出力に出すように設定します. RAILS_ROOT/config/environments/development.rbに 以下のように設定します. ``` config.logger = Logger.new(STDOUT) ``` productionであれば, RAILS_ROOT/config/environments/production.rb に 始めから以下のように記述があるので環境変数 `RAILS_LOG_TO_STDOUlT` を設定するだけでよいです. ``` if ENV["RAILS_LOG_TO_STDOUT"].present? logger = ActiveSupport::Logger.new(STDOUT) logger.formatter = config.log_formatter config.logger = ActiveSupport::TaggedLogging.new(logger) end ``` ログファイルをリダイレクトする Railsの設定を変更したくない場合は,Dockerfileで以下のようにして development.log を標準出力にリダイレクトすることでも解決できます. ``` ln -sf /dev/stdout RAILS_ROOT/log/development.log ``` これは nginxでも採用されている方法です. 補足: docker status が restartingになる docker-compose.ymlに `command: /bin/bash` と記載すると コンテナはbashを起動しますが,何も処理をすることなく終了します. おそらく,docker-compose.yml にて `restart: always` のように記載していることから, 終了後も再起動してまた終了するを繰り返し,statusがrestartingから変わらないのだと思います. 単にコンテナを起動させ続けたいのであれば, docker-compose.yml に `tty: true`と記載し入力を待たせる, または `command: bin/bash` ではなく `command: /usr/bin/tail -f RAILS_ROOT/log/development.log` と記載する(上記railsと合わせて標準出力にログ内容が出力される), などの方法があります.