如何使用pry在docker中调试rails应用程序?

fey*_*fey 35 ruby-on-rails pry docker

我在开发环境中的docker容器中运行了一个rails应用程序.

当我尝试通过binding.pry在代码中放置某个位置并附加到容器来调试它时,我可以看到pry输出中的提示但它不会暂停在它上面,我无法像它没有docker容器那样与它交互.

那么我该如何调试容器化的应用程序呢?

Gab*_*ley 56

如果您正在使用docker-compose,则可以将这些标志添加到docker-compose.yml:

app:
  tty: true
  stdin_open: true
Run Code Online (Sandbox Code Playgroud)

然后依附于您的流程docker attach project_app_1.pry-rails现在在这里工作.确保less安装在您的容器上,以获得最佳的撬具体验.

比照 https://github.com/docker/compose/issues/423#issuecomment-141995398


小智 25

使用pry你必须以不同的方式运行它:

docker-compose run --service-ports web

查看这篇文章了解更多信息:

http://blog.carbonfive.com/2015/03/17/docker-rails-docker-compose-together-in-your-development-workflow/

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 (2认同)

Yi *_*Xie 9

作为加布Kopley答案,假设你的轨道容器称为app,设置stdin_openttytrue

app:
  stdin_open: true
  tty: true
Run Code Online (Sandbox Code Playgroud)

并且我写了一个bash脚本来简化生活,将其保存到bin/dev

#!/bin/bash
docker-compose up -d && docker attach $(docker-compose ps -q app)
Run Code Online (Sandbox Code Playgroud)

不要忘记将dev被执行chmod +x bin/dev

在您的终端中,键入bin/dev,它将自动运行容器并附加应用容器。当binding.pry调用,您可以直接输入到终端。


小智 5

当我在Passenger中运行pry时,我遇到了同样的问题.尝试将"pry-rails"Gemfile 更改为gem "pry-remote",这将启动dRuby或没有依赖关系的分布式协议.

你希望在执行调用中停止代码"binding.remote_pry"而不是"binding.pry"

然后只需remote-pry在控制台中调用即可访问它.它应该工作相同.在您的测试环境中,通常binding.pry工作正常.


Ada*_*bik 5

如果您不使用docker-compose,您可以简单地使用选项运行容器-it

例如:

docker run -v /Users/adam/Documents/Rails/Blog/:/usr/src/app -p 3000:3000 -it blog
Run Code Online (Sandbox Code Playgroud)