Rails本の写経をdocker-compose
で行なったときのTips。
TL;DR
docker-compose
で作ったRubyOnRailsコンテナでbinding.pry
によるデバッグを行えるようにする。
前提
docker-compose
でRails、Spring用のコンテナなど、複数コンテナを起動する形のRails環境を構築した。基本構成は以下の記事に習っている。
高速に開発できる Docker + Rails開発環境のテンプレートを作った
事前準備
Railsをデバッグ実行するために必要な設定ファイルの準備をする。
コンテナの標準入出力にアタッチするために、Dockerの設定をしておく。
services:
rails: &app_base
tty: true
stdin_open: true
ブレークポイントを貼るためのbinding.pry
をするためのGemを追加する。
Gemfileはpry-rails
の他にpry-byebug
も追加しておくとステップ実行が出来る。
group :development, :test do
gem 'pry-rails'
gem 'pry-byebug'
end
Railsプロジェクトのrootディレクトリに.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
で抜ける。