如何使用 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
查看这篇文章了解更多信息:
如果您正在使用 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_open
和 tty
设置为 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
。
那你就可以了
我在开发环境的 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
查看这篇文章了解更多信息:
如果您正在使用 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_open
和 tty
设置为 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
.
如果这就是您的错误日志中的原因:
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
。
那你就可以了