Docker

【Rails×Docker】Docker環境でbinding.pryを使用する手順について初心者向けにまとめてみた

Docker

 

今回はDocker環境でbinding.pryを使用する手順について簡単に解説したいと思います。Docker環境でbinding.pryを実行するにはちょっとした設定が必要ですが、そこまで難しくないのでこの機会に準備しておきましょう。

Rails
【Rails】Rails開発者に絶対おすすめしたいデバッグ手法5選(初心者向け)Railsの開発で活躍するデバッグ方法5選を紹介しています。Railsでは様々なデバッグ手法やgemが用意されていますが、今回はその中でも頻繁に使われるもののみをまとめてみました。デバッグ手法に迷った時の参考にしてください。...

binding.pryを実行する手順

Docker環境上でbinding.pryを実行する手順を簡単にまとめると以下のようになります。

  1. gem ‘pry-rails’のインストール
  2. docker-compose.ymlの書き換え
  3. binding.pryの記述
  4. docker psコマンドでコンテナIDを確認
  5. docker attach コンテナIDでrailsサーバーにattach

 

では上記を把握した上で、具体的に見ていきましょう。

gem ‘pry-rails’のインストール

まずはbinding.pryを使用するためのgem ‘pry-rails’をインストールします。

group :development, :test do
  gem 'pry-rails'
end
% docker-compose run app bundle install
% docker-compose build --no-cache
gemインストール後、buildを再度実行することでDocker環境でも適用できるようになります。キャッシュでbuildしてしまうことを避けるため、念のため「–no-cache」オプションを付与しています。

docker-compose.ymlの書き換え

続いてdocker-compose.ymlを書き換え、binding.pryで処理が止まるように設定します。以下の2行をdocker-compose.ymlのapp(もしくはweb)以下に配置しましょう。

app:
  tty: true
  stdin_open: true

 

上記を追記した後のコードは以下のように形になるかと思います。

version: "3"
services:
  db:
    image: mysql:5
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
    volumes:
      - ./tmp/db:/var/lib/mysql
    ports:
      - 3306:3306
  app:
    build: .
    volumes:
      - .:/myapp
      - /app/node_modules/
    ports:
      - "3000:3000"
    environment:
      - CLIENT_ORIGIN=http://localhost:8080
      - API_ORIGIN=http://localhost:3000
    depends_on:
      - db
    tty: true
    stdin_open: true
上記コードはあくまで一例です。

binding.pryの記述

ここまででDocker環境でbinding.pryを使用する設定が完了しました。

では実際に処理を止めたい箇所にbinding.pryを記載しましょう。今回はcreateアクションの中にbinding.pryを仕込んでみました。

def create
  binding.pry
  @record = Record.new(record_params)
  if @record.valid?
    @record.save
    redirect_to records_path
  else
    render :new
  end
end

 

ここでDockerを立ち上げ、実際にcreateアクションで処理が止まるか確認します。

% docker-compose up

 

以下のように、処理が止まっていることが確認できたら次の項目に進みましょう。

処理が止まる

docker psコマンドでコンテナのIDを確認

次に、処理が止まった状態で「command + t」を押し、別タブでターミナルを開きます。

command + t

 

先ほど開いたターミナルで「docker ps」コマンドを入力し、実行中のコンテナとそのIDを確認しましょう。

% docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
e6edae8815d4        test_app            "run"                    27 hours ago        Up 16 minutes       0.0.0.0:3000->3000/tcp, 3035/tcp    test_app_1
2c78b2876a78        mysql:5             "docker-entrypoint.s…"   2 weeks ago         Up 16 minutes       0.0.0.0:3306->3306/tcp, 33060/tcp   test_db_1
上記の場合、使用するコンテナIDはe6edae8815d4になります。

docker attach コンテナIDでrailsサーバーにattach

最後に「docker attach コンテナID」を入力しEnterキーを押しましょう。

今回の場合だとコマンドは以下になります。

% docker attach e6edae8815d4

 

するとpryが開かれるので、試しにparamsやshow-modelsと入力してみてください。

% docker attach e6edae8815d4
pry(#<RecordsController>)> params
=> <ActionController::Parameters {"authenticity_token"=>"0hlZaVEVhfYuXSbsRD9/p8Lqr0JmBukQ4VbslqY061ohNaHoAnuaXOalR1lkOgNKK3FA1LGFnMmGxPfPHQ7AjA==", "record"=>{"regist_date"=>"2020-12-04", "images"=>["eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBEUT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--c4b234f8bcdaa74f823d06e4a30b69305145c33c"], "memo"=>"aaa"}, "commit"=>"登録", "controller"=>"records", "action"=>"create"} permitted: false>

pry(#<RecordsController>)> show-models
ActiveStorage::Attachment
  id: integer
  name: string
  record_type: string
  record_id: integer
  blob_id: integer
  created_at: datetime
  belongs_to :blob (class_name :ActiveStorage::Blob)
  belongs_to :record
ActiveStorage::Blob
  id: integer
  key: string
  filename: string
  content_type: string
  metadata: text
  byte_size: integer
  checksum: string
  created_at: datetime
  has_many :attachments
  has_one :preview_image_attachment (class_name :ActiveStorage::Attachment)
  has_one :preview_image_blob (through :preview_image_attachment, class_name :ActiveStorage::Blob)
pryが開かない場合は、数回Enterキーを叩くことで解決できます。

 

デバッグを終了したい時は、いつもと同じようにexitを入力することでbinding.pryを終了することができます。

pry(#<RecordsController>)> exit

まとめ

Docker環境でbinding.pryを使用する手順を簡単にまとめたものは以下になります。

  1. gem ‘pry-rails’のインストール
  2. docker-compose.ymlの書き換え
  3. binding.pryの記述
  4. docker psコマンドでコンテナIDを確認
  5. docker attach コンテナIDでrailsサーバーにattach

参考

briankung/docker-pry-rails.md:
https://gist.github.com/briankung/ebfb567d149209d2d308576a6a34e5d8

 

 

今回はDocker環境でbinding.pryを使用する手順について解説しました。Docker環境でもデバッグは絶対に必要になってきますので、ぜひこの機会に理解して使えるようにしておきましょう。