🙆

railsのデバッグをDockerでやる方法

2022/06/15に公開2

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+PCtrl+Q で抜けるとよいです。

GitHubで編集を提案

Discussion