Docker と Rails 5.2 の開発環境でデバッグを行えるようにする

こんにちは。開発グループでエンジニアをしている石塚です。

最近はDockerを使ってRailsアプリケーションの開発を行なっている人も増えましたが、web-consoleやbyebugを使ったデバッグが動かなくて困っている方もいるかと思います。

そこで、今日はDockerを使った開発環境でweb-consoleとbyebugを使えるようにする方法を紹介したいと思います。

web-consoleとbyebugって何?

web-consoleとbyebugはRuby on Railsガイドでも紹介されているデバッグ用のgemです。

コードが期待どおりに動作しない場合は、ログやコンソールに出力して問題を診断することができます。ただし、この方法ではエラー追跡を何度も繰り返さねばならず、根本的な原因を突き止めるには能率がよいとは言えません。 実行中のコードに探りを入れる必要があるのであれば、最も頼りになるのはやはりデバッガーです。

デバッガーは、Railsのソースコードを追うときに、そのコードをどこで開始するのかがを知りたいときにも有用です。アプリケーションへのリクエストをすべてデバッグし、自分が書いたコードからRailsのもっと深いところへダイブする方法を本ガイドから学びましょう。

railsguides.jp

byebugはコンソールで動作するのに対してweb-consoleはブラウザで動作する点が違います。

GitHub - rails/web-console: Rails Console on the Browser.

GitHub - deivid-rodriguez/byebug: Debugging in Ruby 2

どちらもRuby on RailsガイドやGithubに使い方が書いてありますが、Dockerと組み合わせて使う場合はもう少しコツが必要になります。

前提条件

この記事ではdocker composeのサービス名を web にしています。 このサービス名は docker-compose コマンドで利用されるため人によって違う点に注意してください。

f:id:coconalainc:20181204165825p:plain

web-consoleを使えるようにする

どうやるか

config/environments/development.rb に以下を記載することで使えるようになります。

Rails.application.configure do
  config.web_console.whitelisted_ips = %w[127.0.0.1 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16]
end

アプリケーションの再起動も必要なので以下のコマンドも実行しましょう。

$ docker-compose exec web bundle exec rails restart
whitelisted_ipsって何?

web-consoleを仕込んだ画面ではブラウザから何でも実行できるようになってしまうという非常に危険な一面があります。

そこでweb-consoleはアクセス元のIPアドレスが 127.0.0.1の場合だけ使えるというセキュリティを用意しています。

127.0.0.1は http://localhost など自分のPC内にアクセスした場合のIPアドレスになるため、外からのアクセスじゃないから大丈夫だということです。

Dockerだとなぜ使えないのか?

Docker環境で動かしている場合は http://localhost でアクセスしても間にDockerが挟まっているため、Ruby on Railsからみたときのアクセス元が127.0.0.1になりません。

f:id:coconalainc:20181204172721p:plain

例えばコントローラーでrequest.remote_ip値を出力してみると違うIPアドレスが表示されます。

f:id:coconalainc:20181204173520p:plain

そこで、Dockerで使われる可能性がある以下のIPアドレスをホワイトリストに追加する必要があります。

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16
注意事項

許可するアクセス元のIPアドレスを広げてしまうため当然セキュリティは若干下がってしまいます。 特に本番環境でweb-consoleが使われてしまうと危険なため、この設定は必ず開発環境の設定ファイルである config/environments/development.rb に記載するようにしましょう。

byebugを使えるようにする

どうやるか

コンソールで以下のコマンドを実行してから1回Entryを入力すると、buybugのデバッグ画面に入ることができます。

$ docker attach $(docker-compose ps -q web)
何をやっているのか

Dockerを使っている場合は直接rails serverコマンドを実行するのではなくdocker-composeコマンドで立ち上げることになります。 そのため、buybugの操作を行うためには後からrails serverを起動しているプロセスに入り直す必要があります。

このDockerコンテナで起動しているプロセスに後から入れるのがdocker attachコマンドになります。 docker attachコマンドの引数には入りたいコンテナのIDを指定する必要があります。

docker-compose ps -q web コマンドではwebサービスのコンテナIDを取ってくることができます。 これらを組み合わせることでワンライナーでコンテナに入ることができるようになります。

注意点

dockerはコンテナ内で動いているプロセスの終了を検知してコンテナも終了します。 そのため、buybugでquitを実行してしまうとコンテナ毎終了してしまうため、buybugから抜けたい場合は Ctrl + P -> Ctrl + Q を実行するようにしましょう。

まとめ

今回は Docker と Rails 5.2 を使った開発環境でデバッグを行えるようにする方法を紹介させて頂きました。

いくつかのコツは必要ですが、やり方さえ分かってしまえばとても簡単ではないかと思います。

Dockerは決して難しいものではないので、ぜひ皆さん使ってみてください。

f:id:coconalainc:20180803124012p:plain