已安装pry-rails仍报undefined method `pry'的Rails容器问题
解决GitLab Rails容器中
binding.pry undefined method错误 问题场景
通过docker compose run --service-ports --detach [SERVICE_NAME]启动GitLab的Ruby on Rails Web应用容器,目标是用binding.pry断点调试源码函数。为规避初始bundle install问题,进入容器后执行gem install pry-rails安装依赖,但即便Gemfile中已引入该gem,仍触发以下错误:
==> /var/log/gitlab/gitlab-rails/production.log <== ActionView::Template::Error (undefined method `pry' for #<Binding:0x00007ff556ce52b8> Did you mean? try):
已确认信息
- pry-rails已成功安装:
root@3cbe23da9b57:/# gem list | grep pry-rails pry-rails (0.3.9) root@3cbe23da9b57:/# gem which pry-rails /opt/gitlab/embedded/lib/ruby/gems/3.0.0/gems/pry-rails-0.3.9/lib/pry-rails.rb
- Gemfile中的引入配置:
group :development, :test do gem 'pry-rails', '~> 0.3.9' end
- RubyGems环境信息:
RubyGems Environment: - RUBYGEMS VERSION: 3.4.14 - RUBY VERSION: 3.0.6 (2023-03-30 patchlevel 216) [x86_64-linux] - INSTALLATION DIRECTORY: /opt/gitlab/embedded/lib/ruby/gems/3.0.0 - USER INSTALLATION DIRECTORY: /root/.local/share/gem/ruby/3.0.0 - RUBY EXECUTABLE: /opt/gitlab/embedded/bin/ruby - GIT EXECUTABLE: /opt/gitlab/embedded/bin/git - EXECUTABLE DIRECTORY: /opt/gitlab/embedded/bin - SPEC CACHE DIRECTORY: /root/.local/share/gem/specs - SYSTEM CONFIGURATION DIRECTORY: /opt/gitlab/embedded/etc - RUBYGEMS PLATFORMS: - ruby - x86_64-linux - GEM PATHS: - /opt/gitlab/embedded/lib/ruby/gems/3.0.0 - /root/.local/share/gem/ruby/3.0.0 - GEM CONFIGURATION: - :update_sources => true - :verbose => true - :backtrace => true - :bulk_threshold => 1000 - REMOTE SOURCES: - https://rubygems.org/ - SHELL PATH: - /opt/gitlab/embedded/bin - /opt/gitlab/bin - /assets - /usr/local/sbin - /usr/local/bin - /usr/sbin - /usr/bin - /sbin - /bin
问题原因
- Bundle环境未加载独立安装的gem:GitLab的Rails应用依赖
bundle管理依赖,直接用gem install安装的pry-rails不在bundle的加载路径中,Rails无法识别。 - 运行环境不匹配:日志显示应用运行在
production环境,而pry-rails仅被加入development和test组,生产环境默认不会加载该组的gem。
解决方案
方案1:切换到开发环境并执行bundle install
- 重新启动容器时指定开发环境:
docker compose run --service-ports --detach -e RAILS_ENV=development [SERVICE_NAME]
- 进入容器后执行bundle安装,让bundle识别并加载pry-rails:
docker exec [CONTAINER_ID] /bin/bash bundle install
方案2:临时手动引入pry-rails
在需要调试的代码前添加手动引入语句,仅作为临时调试方案:
require 'pry-rails' binding.pry
方案3:修改Gemfile后重新构建镜像(若允许)
如果可以重新构建镜像,调整Gemfile后执行构建,确保bundle install在镜像构建阶段完成:
- 确保pry-rails的分组符合运行环境需求,或临时移到全局组(调试完成后改回);
- 重新构建Docker镜像并启动容器。
内容的提问来源于stack exchange,提问作者netcat_dd
相关产品推荐
相关产品推荐

