1
0

More than 3 years have passed since last update.

Docker+rails環境にて、binding.pryが発動しない!

Posted at

環境

ruby:2.5.3
rail:5.2.2
Docker:3
Mysql:5.7

現象

Docker,rails環境を使用し開発を進め、変数の値がどうなっているかを確認するため

  • gem 'pry-rails'
  • gem 'pry-byebug'

をインストール後、
binding.pryを仕掛けたが
仕掛けたところで止まってくれなかった。

失敗環境

Docker-compose.yml ↓↓

#docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: root
    ports:
      - "5500:3306"

  web:
    build: .
    command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b 0.0.0.0"
    volumes:
      - .:/app_name
    ports:
      - "5000:3000"
    links:
      - db

止めたかった場所 ↓↓

#コントローラー 
class FrontController < ApplicationController
  layout false
  require "open-uri"
  require "nokogiri"
  def index

    binding.pry  #ここで止めたい!!!!!!!!!!!

    url = "https://www.sejuku.net/blog/"
    charset = nil
    html = URI.open(url) do |page|
      charset = page.charset
      page.read
      @contents = Nokogiri::HTML.parse(html,nil,charset)
    end
  end
end

ブラウザ更新後のターミナル ↓↓

#ターミナル
From: /app_name/app/controllers/front_controller.rb:10 FrontController#index:

     5: def index
     6: 
     7:   binding.pry
     8:   
     9:   #クレイピング対象のURL
 => 10:   url = "https://dummy"
    11:   #取得するhtml用charset
    12:   charset = nil
    13:   
    14:   html = URI.open(url) do |page|
    15:     #charsetを自動で読み込み、取得
    16:     charset = page.charset
    17:     #中身を読む
    18:     page.read
    19:     @contents = Nokogiri::HTML.parse(html,nil,charset)
    20:   end
    21: end

[1] pry(#<FrontController>)>   Rendering front/index.html.erb
  Rendered front/index.html.erb (0.5ms)
Completed 200 OK in 241ms (Views: 19.5ms | ActiveRecord: 0.0ms)

処理を止めて色々試したいが勝手にbinding.pryを仕掛けている場所を通過してしまう。
上記のような状態で意外と詰まってしまったためメモ。

解決策

Docker-compose.ymlに

tty: true
stdin_open: true

のどちらか片方でも追加するとちゃんと止まってくれた。(なぜ...?理由は後で)

docker-compose.yml ↓↓

#docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: root
    ports:
      - "5500:3306"

  web:
    build: .
    command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b 0.0.0.0"
    volumes:
      - .:/app_name
    ports:
      - "5000:3000"
    links:
      - db
    tty: true         #ここ!!!!!
    stdin_open: true  #ここ!!!!!

ブラウザ更新後のターミナル ↓↓

#ターミナル
From: /app_name/app/controllers/front_controller.rb:10 FrontController#index:

     5: def index
     6: 
     7:   binding.pry
     8:   
     9:   #クレイピング対象のURL
 => 10:   url = "https://dummy"
    11:   #取得するhtml用charset
    12:   charset = nil
    13:   
    14:   html = URI.open(url) do |page|
    15:     #charsetを自動で読み込み、取得
    16:     charset = page.charset
    17:     #中身を読む
    18:     page.read
    19:     @contents = Nokogiri::HTML.parse(html,nil,charset)
    20:   end
    21: end

[1] pry(#<FrontController>)> 

これで一応解決。

「tty:」  と 「stdin_open:」  って何?

参考記事
【Rails】Docker環境下でbinding.pryを使えないとき確認すべきポイント4つ

stdin_open:

標準入出力とエラー出力をコンテナに結びつける設定コマンド。

tty:

擬似端末(キーボードによる入力)をコンテナに結びつける設定コマンド。
これにより「コンテナを起動させ続けること」ができるようになる。

推測

上記が抜けているとホストPCからDockerコンテナに対して入力するための術がないために
勝手に(自動で)「Exit」のような処理がなされていた?ということ?

詳しい事はわからなかっため、分かる方がいらっしゃったらコメントを頂ければ嬉しいです。
以上です!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0