每当gem'无法加载命令时:rake'

Awa*_*tah 4 ruby cron whenever ruby-on-rails-3.2 docker

寻求一些帮助.

我正在使用whenevergem(v0.9.7)和rake(v11.2.2)运行rails app (v3.2.5).我也在一个docker容器映像中执行此操作ruby:2.3(cron已安装并bundle install已运行)

这是我的 schedule.rb

set :environment, ENV['RAILS_ENV']

every '*/2 9,10,11,12,13,14,15,16 * * 1-5' do
    rake "import_csv", output: {:error => 'log/import_csv_errors.log', :standard => 'log/import_csv.log'}'
end
Run Code Online (Sandbox Code Playgroud)

note RAILS_ENV设置在容器启动时development

这是我在build(crontab -l)后面的容器上的cron作业:

# Begin Whenever generated tasks for: /usr/src/app/config/schedule.rb
*/2 9,10,11,12,13,14,15,16 * * 1-5 /bin/bash -l -c 'cd /usr/src/app && RAILS_ENV=development bundle exec rake import_csv --silent >> log/import_csv.log 2>> log/import_csv_errors.log'

# End Whenever generated tasks for: /usr/src/app/config/schedule.rb
Run Code Online (Sandbox Code Playgroud)

当此cron作业运行时,日志返回:

import_csv_errors.log

Bundler::GemNotFound: Could not find rake-11.2.2 in any of the sources
  /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/spec_set.rb:95:in `block in materialize'
  /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/spec_set.rb:88:in `map!'
  /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/spec_set.rb:88:in `materialize'
  /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/definition.rb:140:in `specs'
  /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/definition.rb:185:in `specs_for'
  /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/definition.rb:174:in `requested_specs'
  /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/environment.rb:19:in `requested_specs'
  /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/runtime.rb:14:in `setup'
  /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler.rb:95:in `setup'
  /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/setup.rb:19:in `<top (required)>'
  /usr/local/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
  /usr/local/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
Run Code Online (Sandbox Code Playgroud)

import_csv.log

bundler: failed to load command: rake (/usr/local/bin/rake)
Run Code Online (Sandbox Code Playgroud)

现在这是奇怪的事情.如果我复制cron job命令:

/bin/bash -l -c 'cd /usr/src/app && RAILS_ENV=development bundle exec rake import_csv --silent >> log/import_csv.log 2>> log/import_csv_errors.log'
Run Code Online (Sandbox Code Playgroud)

并在容器中运行它,它工作正常,但如果cron作业运行它,我在日志中得到错误!我迷失在这里......

我试过添加

env :PATH, ENV['PATH']
env :GEM_PATH, '/usr/local/bundle'
Run Code Online (Sandbox Code Playgroud)

到顶部,schedule.rb我试着做

command 'cd /usr/src/app && RAILS_ENV=development bundle exec rake import_csv --silent >> log/import_csv.log 2>> log/import_csv_errors.log'
Run Code Online (Sandbox Code Playgroud)

而不是rake在任务中使用,我得到相同的错误..

任何帮助都是适当的

Sla*_*lin 5

我通过修改修复了相同的错误Dockerfile:

RUN gem update --system 2.6.12
RUN gem install bundler --version 1.14.6
Run Code Online (Sandbox Code Playgroud)

而且schedue.rb:

ENV.each { |k, v| env(k, v) }
Run Code Online (Sandbox Code Playgroud)

  • 在 `ENV.each { ... }` 上+1 — 就成功了。我一直在忙于单独的环境变量,不知道为什么我没有想到这种(更简单的)方法 (3认同)

小智 1

我已经更新了我的 rake 版本,它对我有用。以下是我遵循的步骤:

sudo bundle update rake
sudo bundle install
Run Code Online (Sandbox Code Playgroud)

打开 Rakefile 并将该行替换rake/rdoctaskrequire 'rdoc/task'.