我正在使用Capistrano来部署我的应用程序。应用程序在Passenger独立运行。当我重新部署应用程序时,Passenger仍然使用旧版本中的Gemfile,因为BUNDLE_GEMFILE环境变量尚未更新。
我应该将更新后的路径放到Gemfile中,以便Passenger在重新启动时选择它?
服务器启动命令是monit,我只是从Capistrano任务调用monit脚本,除了重启,我只需触摸restart.txt。
namespace :deploy do
task :stop do
run("sudo /usr/bin/monit stop my_app_#{rails_env}")
end
task :restart do
run("cd #{current_path} && touch tmp/restart.txt")
end
task :start do
run("sudo /usr/bin/monit start my_app_#{rails_env}")
end
monit中的启动命令是:
start program = "/bin/su - app_user -l -c 'cd /home/app_user/current && bundle exec passenger start -d -p 8504 -e production --pid-file=/home/app_user/current/tmp/pids/passenger.8504.pid /home/app_user/current'"
我已经尝试将BUNDLE_GEMFILE添加到启动命令中,如下所示:
start program = "/bin/su - app_user -l -c 'cd /home/app_user/current && BUNDLE_GEMFILE=/home/app_user/current/Gemfile bundle exec passenger start -d -p 8504 -e production --pid-file=/home/app_user/current/tmp/pids/passenger.8504.pid /home/app_user/current'"
但它没有用,因为路径/home/app_user/current
是一个发布路径的符号链接,而是取而代之的是发布路径。
答案 0 :(得分:1)
简单的解决方案。
定义要在服务器启动命令中使用的Gemfile。例如:
BUNDLE_GEMFILE=/home/app_user/current/Gemfile bundle exec passenger start -d -p 9999 -e production --pid-file=/home/app_user/current/tmp/pids/passenger.9999.pid /home/app_user/current
早期的解决方案(在.profile中设置BUNDLE_GEMFILE env变量)并不好。当您部署新版本的应用程序并且捆绑包中有新的gem时,迁移等将失败,因为它仍将使用env变量中定义的Gemfile。