開発環境のdockerコンテナーで実行されているRailsアプリがあります。
コードのどこかにbinding.pry
を配置してコンテナにアタッチしてデバッグしようとすると、出力にpry
プロンプトが表示されますが、一時停止せず、対話できません。 Dockerコンテナがない場合と同様です。
それでは、コンテナ化されたアプリをどのようにデバッグしますか?
Docker-composeを使用している場合、これらのフラグをdocker-compose.yml
に追加できます。
app:
tty: true
stdin_open: true
そして、docker attach project_app_1
を使用してプロセスにアタッチします。 pry-Rails
はここで動作します。最適なこじ開け体験のために、less
がコンテナにインストールされていることを確認してください。
cf. https://github.com/docker/compose/issues/423#issuecomment-141995398
pryを使用するには、別の方法で実行する必要があります。
docker-compose run --service-ports web
詳細については、この記事をご覧ください。
Gabe Kopley答えとして、Railsコンテナはapp
と呼ばれ、stdin_open
とtty
をtrue
:
app:
stdin_open: true
tty: true
生活を楽にするためにbashスクリプトを書き、bin/dev
に保存しました:
#!/bin/bash
docker-compose up -d && docker attach $(docker-compose ps -q app)
dev
をchmod +x bin/dev
によって実行可能にすることを忘れないでください
端末でbin/dev
と入力すると、コンテナが自動的に実行され、アプリコンテナがアタッチされます。 binding.pry
が呼び出されると、端末に直接入力できます。
Passengerでこじ開けを実行しているときに同じ問題が発生しました。 Gemfileの"pry-Rails"
をgem "pry-remote"
に変更してみてください。これにより、dRuby、または依存関係のない分散プロトコルが開始されます。
実行中のコードを停止する場所"binding.remote_pry"
ではなく"binding.pry"
を呼び出します
次に、コンソールでremote-pry
を呼び出してアクセスします。同じように動作するはずです。テスト環境では、通常のbinding.pry
が正常に機能します。
ただし、docker-compose
を使用しない場合は、-it
オプションでコンテナを実行するだけです。
例えば:
docker run -v /Users/adam/Documents/Rails/Blog/:/usr/src/app -p 3000:3000 -it blog