docker+铁轨+ redis – 救援人员没有运行

我创build了一个docker环境,创build3个图像:rails,postgresql和redis。 它一直工作得很好,但我发现我的redis映像似乎没有任何工作者在运行。

Docker信息

我的docker-compose.yml如下

web: build: . command: bundle exec unicorn -p 3000 -c config/unicorn.rb volumes: - .:/fitmo - ../fitmo-core:/fitmo-core ports: - "3000:3000" links: - db - redis environment: - REDIS_URL=redis://redis:6379 db: build: ./db/docker-files ports: - "5432" redis: image: redis:2.8 ports: - "6379" 

Resque Config

 require 'resque' require 'resque-scheduler' require 'resque_scheduler/server' require 'appsignal/integrations/resque' require 'yaml' if Rails.env.test? require 'mock_redis' $redis = MockRedis.new else uri = URI.parse(ENV['REDIS_URL']) $redis = Redis.new(host: uri.host, port: uri.port, password: uri.password) end Resque.redis = $redis Resque.schedule = YAML.load_file(File.join(Rails.root, 'config/resque_schedule.yml')) Resque.before_fork do defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect! end Resque.after_fork do defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection end module Resque def queued_jobs queues = Hash.new Resque.queues.each do |queue| jobs = [] Resque.peek(queue, 0, 5000).each do |job| jobs.push({klass: job['class'], args: job['args']}) end queues[queue] = jobs end queues end def queued?(klass, *args) queued_jobs.select do |job| job[:klass] == klass.to_s && job[:args] == args end.any? end def enqueue_once(klass, *args) enqueue(klass, *args) unless queued?(klass, *args) end end 

rubygem

以下是正在使用的相关gem。 注释掉的版本是最新版本的gem,但我不认为这是一个问题,因为目前的版本在Heroku环境中工作正常。 我还包括救援邮件和调度程序的彻底性。 他们不是为了这个问题

 gem 'redis', '3.0.7' #'~> 3.2.0' gem 'resque', '~> 1.25.2' #'~> 1.25.2' gem 'resque_mailer', '~> 1.0.1' #'~> 2.2.7' gem 'resque-scheduler', '~> 2.5.5' #'~> 4.0.0' 

testing信息

我已经确认redis可以通过远程login到主机redis的端口6379从web容器访问。我也输出了Rescue.info的值,它显示有排队的项目,但现在工人正在运行

 resque info: {:pending=>1, :processed=>0, :queues=>2, :workers=>0, :working=>0, :failed=>0, :servers=>["redis://redis:6379/0"], :environment=>"development"} 

我被困在这一点,因为我不知道如何让工人运行。 有什么build议么?

我能够通过包含一个基于Web图像的新图像来解决这个问题。 我的新docker-compose.yml文件如下(添加新的工人图像):

 web: build: . command: bundle exec unicorn -p 3000 -c config/unicorn.rb volumes: - .:/fitmo - ../fitmo-core:/fitmo-core ports: - "3000:3000" links: - db - redis environment: - REDIS_URL=redis://redis:6379 worker: build: . command: bundle exec rake environment resque:work QUEUE=* volumes: - .:/fitmo - ../fitmo-core:/fitmo-core links: - db - redis environment: - REDIS_URL=redis://redis:6379 db: build: ./db/docker-files ports: - "5432" redis: image: redis:latest ports: - "6379" 

如果你已经安装了AppSignal gem,并且你正在使用“扩展Appsignal :: Integrations :: ResquePlugin”来扩展你的作业,那么后续的问题就是ResquePlugin会尝试向tmp文件夹写入一个套接字,而Docker不允许它。

我确定有一个Dockerconfiguration允许写入套接字,但是我已经在我的appsignal.yml文件中创build了一个开发部分,并将active标志设置为false。 即使active = false,最新版本的Appsignal gem仍会尝试写入套接字。 gem版本0.13.0(明天发布)应该有一个修复这个地方

appsignal.yml

 production: api_key: "xxxxxxxxxxxxxxxxxxxxxxxx" active: true slow_request_threshold: 200 staging: api_key: "xxxxxxxxxxxxxxxxxxxxxxxx" active: true slow_request_threshold: 200 development: api_key: "xxxxxxxxxxxxxxxxxxxxxxxx" active: false slow_request_threshold: 200 

在resque的github页面https://github.com/resque/resque上 ,它提到你需要运行bin/resque work来开始轮询队列并启动worker。