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

binding.pryを実行する手順
Docker環境上でbinding.pryを実行する手順を簡単にまとめると以下のようになります。
- gem ‘pry-rails’のインストール
- docker-compose.ymlの書き換え
- binding.pryの記述
- docker psコマンドでコンテナIDを確認
- 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
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
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)
デバッグを終了したい時は、いつもと同じようにexitを入力することでbinding.pryを終了することができます。
pry(#<RecordsController>)> exit
まとめ
Docker環境でbinding.pryを使用する手順を簡単にまとめたものは以下になります。
- gem ‘pry-rails’のインストール
- docker-compose.ymlの書き換え
- binding.pryの記述
- docker psコマンドでコンテナIDを確認
- docker attach コンテナIDでrailsサーバーにattach
参考
briankung/docker-pry-rails.md:
https://gist.github.com/briankung/ebfb567d149209d2d308576a6a34e5d8
今回はDocker環境でbinding.pryを使用する手順について解説しました。Docker環境でもデバッグは絶対に必要になってきますので、ぜひこの機会に理解して使えるようにしておきましょう。