My External Storage

Sep 2, 2017 - 3 minute read - Comments - RubyOnRails Docker

docker-compose上のRailsのデバッグを行う

Rails本の写経をdocker-composeで行なったときのTips。

TL;DR

docker-composeで作ったRubyOnRailsコンテナでbinding.pryによるデバッグを行えるようにする。

前提

docker-composeでRails、Spring用のコンテナなど、複数コンテナを起動する形のRails環境を構築した。基本構成は以下の記事に習っている。

高速に開発できる Docker + Rails開発環境のテンプレートを作った

事前準備

Railsをデバッグ実行するために必要な設定ファイルの準備をする。

コンテナの標準入出力にアタッチするために、Dockerの設定をしておく。

docker-compose.yml

services:
  rails: &app_base
    tty: true
    stdin_open: true

ブレークポイントを貼るためのbinding.pryをするためのGemを追加する。 Gemfileはpry-railsの他にpry-byebugも追加しておくとステップ実行が出来る。

Gemfile

group :development, :test do
  gem 'pry-rails'
  gem 'pry-byebug'
end

Railsプロジェクトのrootディレクトリに.pryrcファイルを配置しておけばデバッグ中に利用できるエイリアスが貼れる。(他のも色の設定とか出来るらしい)

.pryrc

if defined?(PryByebug)
  Pry.commands.alias_command 'c', 'continue'
  Pry.commands.alias_command 's', 'step'
  Pry.commands.alias_command 'n', 'next'
  Pry.commands.alias_command 'f', 'finish'
end

デバッグしたいメソッドにbinding.pryの記載をして、docker-compose upコマンドでRailsを起動して、該当メソッドが実行される操作を行う。 出力がこんな状態になればpryでデバッグが開始できる状態になっている。

rails_1   | From: /app/app/controllers/staff/customers_controller.rb @ line 4 Staff::CustomersController#index:
rails_1   |
rails_1   |     2: def index
rails_1   |     3:   binding.pry
rails_1   |  => 4:   @search_form = Staff::CustomerSearchForm.new(params[:search])
rails_1   |     5:   @customers = @search_form.search.page(params[:page])
rails_1   |     6: end

操作

上記を行うと、binding.pryが記載された場所で実行がストップしている状態になっている。ここからRailsが実行されているコンテナにアタッチする。 まずアタッチするRailsコンテナをdocker psコマンドで調べる。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
7fdf3a1fd61c        baukis_rails        "prehook 'ruby -v'..."   5 seconds ago       Up 4 seconds        0.0.0.0:3333->3000/tcp   baukis_rails_1 # attachしたいのはこれ
cb68afd353c8        baukis_spring       "prehook 'ruby -v'..."   5 seconds ago       Up 4 seconds                                 baukis_spring_1
7b86e4f07b20        postgres:9.6.2      "docker-entrypoint..."   6 seconds ago       Up 7 seconds        0.0.0.0:5432->5432/tcp   baukis_db_1

その後、docker attachコマンドでコンテナに接続する。反応が無いように見えるときはエンターキーを押下すればpryが始まる。

$ docker attach baukis_krails_1 # docker psコマンドの結果のNAMEに書いてあった名前
[1] pry(#<Staff::CustomersController>)>
[2] pry(#<Staff::CustomersController>)>

デバッグを終了するとき

pry自体はquitコマンドで終了できる。そのあと、 Ctrl + Cなどでdockerの接続を終了すると、コンテナ自体が終了してしまう。 デタッチするときはCtrl-P Ctrl-Qで抜ける。

参考

高速に開発できる Docker + Rails開発環境のテンプレートを作った

Dockerコンテナからのデタッチ

pry-byebugでrubyをデバッグする