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

How to debug a rails app in docker with pry?

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

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

那么如何调试容器化应用程序?

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

你想在执行中停止代码的地方调用 "binding.remote_pry" 而不是 "binding.pry"

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

要使用 pry 你必须 运行 不同:

docker-compose run --service-ports web

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

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

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

app:
  tty: true
  stdin_open: true

然后使用 docker attach project_app_1 附加到您的进程。 pry-rails 现在在这里工作。确保 less 安装在您的容器上以获得最佳的撬动体验。

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

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

例如:

docker run -v /Users/adam/Documents/Rails/Blog/:/usr/src/app -p 3000:3000 -it blog

作为 Gabe Kopley 的回答,假设您的 rails 容器被称为 app,将 stdin_opentty 设置为 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 调用时,您可以直接在终端输入。

如果您 运行 在 alpine linux 又名 ruby-*-alpine 下,您需要安装包含 infocmp.

的软件包 ncurses

如果这就是您的错误日志中的原因:

bin/rails: No such file or directory - infocmp                                                              
Error: undefined method `split' for nil:NilClass 
...
bin/rails:4:in `<main>'                                                                                                                 
FATAL: Pry failed to get user input using `Readline`.                                                       
To fix this you may be able to pass input and output file descriptors to pry directly. e.g.                                    
  Pry.config.input = STDIN                                                                                   
  Pry.config.output = STDOUT                                                                           
  binding.pry    

要修复它,请在您的 Dockerfile 上添加:

RUN apk add ncurses

尽管您可能已经有了 apk add 行,所以只需在此处添加 ncurses

那你就可以了