Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Using pry-rails with Docker

First, add pry-rails to your Gemfile:

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


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:

  tty: true
  stdin_open: true


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


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-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.

#=> <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.


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.



This comment has been minimized.

Copy link

@NicoSa NicoSa commented Mar 7, 2018

Thanks for making this. Really cool, for some reason it just won't work for me though. No idea why. I am able to do all the steps but the pry dialog just never pops up anywhere even though it does definitely stop the app.


This comment has been minimized.

Copy link

@supremebeing7 supremebeing7 commented Mar 26, 2018

Definitely helpful. I'm seeing the same thing as @NicoSa where the pry dialog doesn't show up, but weirdly I can type something, hit enter, and it will then display the prompt, my command, and the result.

Maybe I'm missing some critical package?


This comment has been minimized.

Copy link

@omaressameldin omaressameldin commented Apr 20, 2018

I am having a problem with this. The binding works and everything but when i press the arrow up key for example or any arrow key i dont get the command but ^[[A is there a way to fix that?


This comment has been minimized.

Copy link

@bluciam bluciam commented Jun 21, 2018

I think your problem @supremebeing7 is that you seem to have an ActionCable of something like that which will continue to output to the stdout regardless of the breakpoint.


This comment has been minimized.

Copy link

@tetz-akaneya tetz-akaneya commented Aug 10, 2018

I have the same issue with @supremebeing7. Have you or anyone solved the problem?
On the other hand, I don't have the issue mentioned by @omaressameldin.


This comment has been minimized.

Copy link

@tenebrousedge tenebrousedge commented Aug 28, 2018

@tettttsuo You could disable ActionCable logging in development.rb:

ActionCable.server.config.logger =

This comment has been minimized.

Copy link

@dmtroyer dmtroyer commented Oct 31, 2018

I tried this and docker still just blows past the breakpoint.


This comment has been minimized.

Copy link

@andrewpatterson3001 andrewpatterson3001 commented Jul 19, 2019

While this worked for me previously, it has recently stopped responding to commands like next once it stops at the binding.pry line.


This comment has been minimized.

Copy link

@litewhat litewhat commented Dec 23, 2019

Works for me! Thanks for it!


This comment has been minimized.

Copy link

@ryanzidago ryanzidago commented Feb 23, 2020

Alternatively, granted that you have several docker services, let's say one named db and one named web, you could do this :

  • docker-compose up db (or add any subsequent services where you won't need an interactive shell)
  • docker-compose run --service-ports web.

The command docker-compose run --service-ports web will allow the interactive shell with pry/byebug and you won't need to create a new terminal tab, list all of the running containers and attach to the corresponding.

Thanks to @denispasin for the tip!


This comment has been minimized.

Copy link
Owner Author

@briankung briankung commented Feb 23, 2020


This comment has been minimized.

Copy link

@modullar modullar commented Feb 9, 2021

Works for me, but I can't see my commands on the terminal screen until I sent them.

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