railsのデバッグをDockerでやる方法
binding.pry の導入
Rails のデバッガーツールとして binding.pry は有名ですね。
サーバー起動後、ログ出力時に指定箇所で止めるようなことができます。
しかし、現在 Docker 環境の Rails を動かしており、Docker 環境でどうすればいいのかよくわかりませんでした。
そこで、今回 Docker 環境でのデバッグ方法を示します。
そもそも、binding.pry とは、pry-rails の機能であり、その機能の 1 つに binding.pry があります。
コード上に挟み込むことで、任意の箇所で処理を止められるようになり、変数等の値格納を確認できるようになります。
gem にインストールパッケージの記載
デバッグツールである pry-rails 等のインストールを実施する。
gem 'pry-rails'
gem 'pry-byebug'
gem 'pry-nav'
pry-nav というパッケージがないと、デバッグ時に next というコマンドを利用する際にエラーとなるため、インストール対象物とします。
インストールを実施します。
$ bundle install
使用方法
class UserssController < ApplicationController
def index
@users = User.all
binding.pry
end
end
binding.pry
のところで処理が一旦停止します。
停止後は、コンソールと似たような操作が可能となるため、インスタンス変数である @users
の値の格納を確認できます。
もしくは自分で変数を宣言し、後続処理に渡すことも可能です。
使えるコマンド
next
次の行を実行します。
step
次の行かメソッド内に入ります。メソッド内に入った後、next
で処理を進めて確認可能です。
continue
プログラムの実行を continue して pry を終了します。
finish
現在のフレームが終わるまで実行します。
Docker環境でデバッグするための方法
Docker で Rails 環境を構築している人も少なくはないはずです。
しかし、Docker 環境内で Rails が動いている場合、ログを確認できますが、コンソールのような操作はできません。
一体どうすれば良いのでしょうか。
そこで、今回コンテナアタッチという機能を使って操作できるようにします。
書き換え
docker-compose.yml
ファイルの書き換えで下記を追記します。
web:
tty: true
stdin_open: true
もともと tty
というコマンドは、標準入出力先のデバイスのことを指しており、そのデバイス確認方法として利用されています。
tty は ssh や Telnet などで繋いでいる仮装端末で、/dev/pts
という場所で管理されています。
今回の Docker における tty は少し意味合いが異なっており、仮装端末を配置するコマンドになります。
docker-compose up
でコンテナを立ち上げるとき、起動時に実行されるコマンドでポート待ち受け等をしていない限り、コンテナがすぐに終了してしまいます。
言い換えると、デーモンで動かすプロセスを作っていないとコンテナ起動をしてもプロセスが終了してしまうのですが、このオプションをつけることで起動させ続けることができます。
stdin_open
は、標準入力への接続を示しています。
上記を追加することで、コンテナ内の標準入出力をローカルマシンのターミナルにアタッチする準備が整います。
あとは、下記手順で attach
を実行すると入力可能となります。
// コンテナ名を確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83ebf47a577c rails-eats_web "entrypoint.sh bash …" 17 hours ago Up 13 hours 0.0.0.0:3000->3000/tcp rails-eats_web_1
81def031d993 mysql:5.7 "docker-entrypoint.s…" 17 hours ago Up 13 hours 0.0.0.0:3306->3306/tcp, 33060/tcp rails-eats_db_1
$ docker attach rails-eats_web_1
→attach完了
[1] pry(#<CommentsController>)>
[2] pry(#<CommentsController>)>
[3] pry(#<CommentsController>)>
ここで注意しないといけないのが、アタッチ後のデタッチに関しては、 Ctr+C
などで抜けるとコンテナ終了してしまいます。
デタッチは、Ctrl+P
や Ctrl+Q
で抜けるとよいです。
Discussion
あなたの記事にもっと早く出会いたかった。ナイス記事。
少しでもお役に立てて嬉しいです🙇