docker + rails + redis - 救援人员不运行
docker + rails + redis - rescue workers are not running
我创建了一个 docker 环境,它创建了 3 个图像: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"
重新请求配置
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
Ruby 宝石
以下是正在使用的相关宝石。注释掉的版本是 gems 的最新版本,但我认为这不是问题,因为当前版本在 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'
测试信息
我已经确认可以通过远程登录到端口 6379 上的主机 redis 来从 Web 容器访问 redis。我还输出了 Rescue.info 的值,这表明有项目在排队,但现在工作人员 运行
resque info: {:pending=>1, :processed=>0, :queues=>2, :workers=>0, :working=>0, :failed=>0, :servers=>["redis://redis:6379/0"], :environment=>"development"}
我被困在这一点上,因为我不确定如何获得工人 运行。有什么建议吗?
在 resque 的 github 页面 https://github.com/resque/resque 上,它提到您需要 运行 bin/resque work
开始轮询队列并启动工作人员。
我能够通过包含一个基于网络图像启动的新图像来解决这个问题。我的新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 并且您正在使用 "extend Appsignal::Integrations::ResquePlugin" 扩展您的作业,则会出现后续问题问题是 ResquePlugin 尝试将套接字写入 tmp 文件夹并且 Docker 不允许。
我确定有一个 Docker 配置允许写入套接字,但我在我的 appsignal.yml 文件中创建了一个开发部分并将活动标志设置为 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
我创建了一个 docker 环境,它创建了 3 个图像: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"
重新请求配置
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
Ruby 宝石
以下是正在使用的相关宝石。注释掉的版本是 gems 的最新版本,但我认为这不是问题,因为当前版本在 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'
测试信息
我已经确认可以通过远程登录到端口 6379 上的主机 redis 来从 Web 容器访问 redis。我还输出了 Rescue.info 的值,这表明有项目在排队,但现在工作人员 运行
resque info: {:pending=>1, :processed=>0, :queues=>2, :workers=>0, :working=>0, :failed=>0, :servers=>["redis://redis:6379/0"], :environment=>"development"}
我被困在这一点上,因为我不确定如何获得工人 运行。有什么建议吗?
在 resque 的 github 页面 https://github.com/resque/resque 上,它提到您需要 运行 bin/resque work
开始轮询队列并启动工作人员。
我能够通过包含一个基于网络图像启动的新图像来解决这个问题。我的新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 并且您正在使用 "extend Appsignal::Integrations::ResquePlugin" 扩展您的作业,则会出现后续问题问题是 ResquePlugin 尝试将套接字写入 tmp 文件夹并且 Docker 不允许。
我确定有一个 Docker 配置允许写入套接字,但我在我的 appsignal.yml 文件中创建了一个开发部分并将活动标志设置为 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