Rails应用通过Capistrano部署至AWS staging服务器时bundle命令未找到求助
解决Capistrano部署Rails应用时Puma启动提示
bundle: command not found的问题 我之前部署Rails应用到AWS时也碰到过一模一样的问题,大概率是rbenv的环境变量没有在部署的shell会话中正确初始化,导致系统找不到rbenv管理的bundle命令。下面是几个亲测有效的解决思路:
1. 确保rbenv在非交互式shell中正确加载
Capistrano执行远程命令时,默认用的是非交互式登录shell,这类shell通常不会加载~/.bashrc,只会读取~/.bash_profile或~/.profile。你需要检查ubuntu用户的这些配置文件,确保rbenv的初始化代码存在:
打开~/.bash_profile(如果没有就新建),添加以下内容:
export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init -)"
保存后在服务器上执行source ~/.bash_profile生效,重新部署试试。
2. 配置Capistrano的rbenv参数
如果你的Capistrano没有正确集成rbenv,也会导致命令执行环境不对。在项目的deploy.rb里添加以下配置:
set :rbenv_type, :user # 表示rbenv安装在用户目录下 set :rbenv_ruby, '2.5.0' # 指定项目使用的Ruby版本 set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec" set :rbenv_map_bins, %w{rake gem bundle ruby rails puma} # 让这些命令都通过rbenv执行
这样Capistrano会自动为bundle、puma等命令加上rbenv的环境前缀,确保用的是你指定版本的Ruby和对应的bundle。
3. 临时方案:直接使用bundle的绝对路径
如果上面的配置还没生效,可以先手动指定bundle的绝对路径应急。在服务器上执行which bundle(确保当前是rbenv的2.5.0环境),会得到类似~/.rbenv/shims/bundle的路径,然后把Puma启动命令里的bundle替换成这个绝对路径:
cd /home/ubuntu/medcordance/current && ( export RBENV_ROOT="$HOME/.rbenv" RBENV_VERSION="2.5.0" RACK_ENV="staging" ; ~/.rbenv/shims/bundle exec puma -C /home/ubuntu/app_name/shared/puma.rb --daemon )
4. 验证bundle的安装位置
最后可以确认下bundle确实安装在rbenv的2.5.0版本下:
rbenv local 2.5.0 gem list bundle
如果能看到bundle的版本信息,说明安装没问题,问题还是出在环境变量加载上。
内容的提问来源于stack exchange,提问作者Erick Maynard
相关产品推荐
相关产品推荐

