Skip to content

Instantly share code, notes, and snippets.

@briankung
Last active December 12, 2023 10:40
Show Gist options
  • Save briankung/ebfb567d149209d2d308576a6a34e5d8 to your computer and use it in GitHub Desktop.
Save briankung/ebfb567d149209d2d308576a6a34e5d8 to your computer and use it in GitHub Desktop.
Using pry-rails with Docker

First, add pry-rails to your Gemfile:
https://github.com/rweng/pry-rails

gem 'pry-rails', group: :development

Then you'll want to rebuild your Docker container to install the gems

docker-compose build

You should now be able to add a break point anywhere in your code

binding.pry

The problem is that Docker just kind of ignores it and moves on. In order to actually halt execution and use pry as normal, you have to these options to docker-compose.yml:

app:
  tty: true
  stdin_open: true

Source: http://stackoverflow.com/a/37264588/1042144

The next time binding.pry is executed, the process should halt and display an IRB-like console on the rails server screen. But you still can't use it directly. You have to attach a terminal to the docker container.

In order to attach to a docker container, you need to know what its ID is. Use docker ps to get a list of the running containers and their ids.

docker ps

Source: https://www.liquidweb.com/kb/how-to-list-and-attach-to-docker-containers/

Then you can use the numeric ID to attach to the docker instance:

docker attach 75cde1ab8133

It may not immediately show a rails console, but start typing and it should appear. If you keep this attached, it should show the rails console prompt the next time you hit the pry breakpoint.

Neat things you should try with pry:

show-routes
show-models
show-source edit  # If you're in a controller, for instance

cd                # Navigate up or down class hierarchies. try `cd BasicObject`
ls                # Check out what's inside of a class - variables, etc.

And of course you can access local variables just by typing their names.

params
#=> <ActionController::Parameters {"controller"=>"lists", "action"=>"index"} permitted: false>

To end your pry-rails session, you can type exit as you would exit any irb instance.

exit

However, this does not detach the terminal from the docker container. This can be useful to continue debugging.

Additionally, I had two terminals open, one to review the server log and one to attach to my container to use pry-rails, but docker will timeout the server log while the attached terminal continues to run the rails server process. I'm okay with that - I can just leave the terminal attached. However, if you want to detach from the container without ending the process, you need to press ctrl-p + ctrl-q.

Source: http://stackoverflow.com/a/19689048/1042144

@carlosvazquez
Copy link

Thank you! It works with RoR7 in 2022.

@cratag
Copy link

cratag commented Dec 22, 2022

Worked perfectly in docker-compose with RoR 5. Thank you

@adamklingbaum
Copy link

Worked like a charm. Thank you so much!

@jhirn
Copy link

jhirn commented May 1, 2023

I've added the above to my docker-compose and attached to the process but get this error using a binding.pry:

before_session hook failed: Pry::CommandError: Cannot locate this method: allocate.

I think i was atttaching to the wrong container. Used the Id from docker ps and seems to work now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment