67234


Rails の docker コンテナを作って Dockerfile 内に

[code]

    CMD bash -c "rm -f /home/git/rails_test/tmp/pids/server.pid && bundle exec rails s -b '0.0.0.0'"
    
[/code]

とかいて起動でき、ホスト上からブラウザで Rails の画面にアクセスできたんですが  
この状態で Rails が標準出力にはく色付きのログを参照する方法はありませんか？

RAILS_ROOT/logs/development.log にはたまるんですが  
色がついてなくてわかりにくいし  
Logger メソッドを使わないとログにたまらないので  
puts だけで標準出力にはいて手軽にデバッグしたいです

* * *

そこで Rails を自動起動せずにコンテナに入って手動で入ってから

[code]

    bundle exec rails s -b '0.0.0.0'
    
[/code]

をしようと思い、docker-compose.yml に

[code]

    command: /bin/bash
    
[/code]

と書いて docker-compose up -d を実行し直したところまた  
STATUS が `Restarting (0) 31 seconds ago` となるのを繰り返して  
`docker exec -it <container> /bin/bash`  
でコンテナに入ることができません

docker logs にも何も出力されないので何が原因で起動に失敗してるのかもわかりません  
どうすればいいかお知恵をお返しいただけないでしょうか


CC BY-SA 4.0
2020-06-02T08:32:36.150
67226
2020-06-02T13:31:01.977
2020-06-02T08:45:03.550
question
ruby-on-rails docker docker-compose
docker で Rails を動かしてリアルタイムで標準出力をみたい


## Railsのログを標準出力に出す

Railsの設定ファイルで，ログを標準出力に出すように設定します．  
RAILS_ROOT/config/environments/development.rbに 以下のように設定します．

[code]

    config.logger = Logger.new(STDOUT)
    
[/code]

productionであれば， RAILS_ROOT/config/environments/production.rb に  
始めから以下のように記述があるので環境変数 `RAILS_LOG_TO_STDOUlT` を設定するだけでよいです．

[code]

      if ENV["RAILS_LOG_TO_STDOUT"].present?
        logger           = ActiveSupport::Logger.new(STDOUT)
        logger.formatter = config.log_formatter
        config.logger    = ActiveSupport::TaggedLogging.new(logger)
      end
    
[/code]

## ログファイルをリダイレクトする

Railsの設定を変更したくない場合は，Dockerfileで以下のようにして  
development.log を標準出力にリダイレクトすることでも解決できます．

[code]

    ln -sf /dev/stdout RAILS_ROOT/log/development.log
    
[/code]

これは 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と合わせて標準出力にログ内容が出力される)，  
などの方法があります．


CC BY-SA 4.0
2020-06-02T13:31:01.977
67234
2020-06-02T13:31:01.977
7770
67226
answer