Ruby on rails 使用带有Docker Compose的Resque调度程序-连接到本地主机上的Redis时出错:6379
我正在尝试运行我的rails应用程序resque和redis。使用foreman等,我的设置工作正常,但当我尝试使用Docker compose在Docker中运行它时,我得到:Ruby on rails 使用带有Docker Compose的Resque调度程序-连接到本地主机上的Redis时出错:6379,ruby-on-rails,docker,redis,docker-compose,resque-scheduler,Ruby On Rails,Docker,Redis,Docker Compose,Resque Scheduler,我正在尝试运行我的rails应用程序resque和redis。使用foreman等,我的设置工作正常,但当我尝试使用Docker compose在Docker中运行它时,我得到: app_1 | 21:03:13 resque.1 | Redis::CannotConnectError: Error connecting to Redis on redis://redis:6379 (SocketError) app_1 | 21:03:13 resque.1 | Ori
app_1 | 21:03:13 resque.1 | Redis::CannotConnectError: Error connecting to Redis on redis://redis:6379 (SocketError)
app_1 | 21:03:13 resque.1 | Original Exception (Redis::CannotConnectError): Error connecting to Redis on redis://redis:6379 (SocketError)
我的Dockerfile看起来像:
FROM ruby:2.6.3-alpine
RUN apk update && apk add bash build-base libxml2-dev libxslt-dev postgresql postgresql-dev
VOLUME ["/code"]
WORKDIR /code
version: '3'
services:
app:
build: .
command:
- /bin/bash
- -c
- |
bundle check || bundle install
bundle exec rake db:migrate; rake db:seed
bundle exec foreman start
volumes:
- ./:/code
ports:
- "5000:5000"
depends_on:
- redis
environment:
REDIS_URL: redis://redis/5
redis:
image: redis:5.0.5-alpine
我的Docker Compose YML看起来像:
FROM ruby:2.6.3-alpine
RUN apk update && apk add bash build-base libxml2-dev libxslt-dev postgresql postgresql-dev
VOLUME ["/code"]
WORKDIR /code
version: '3'
services:
app:
build: .
command:
- /bin/bash
- -c
- |
bundle check || bundle install
bundle exec rake db:migrate; rake db:seed
bundle exec foreman start
volumes:
- ./:/code
ports:
- "5000:5000"
depends_on:
- redis
environment:
REDIS_URL: redis://redis/5
redis:
image: redis:5.0.5-alpine
我的文件:
web: bundle exec puma -C config/puma.rb
resque: bundle exec rake resque:work QUEUE=*
scheduler: bundle exec rake resque:scheduler
my config/initializers/resque.rb
redis_url = ENV["REDIS_URL"] || "redis://localhost:6379"
Redis.current = Redis.new(url: redis_url)
Resque.redis = Redis.current
还有我的lib/tasks/resque.rake
require "resque/tasks"
require "resque/scheduler/tasks"
task "resque:preload" => :environment
namespace :resque do
task :setup do
require "resque"
end
task setup_schedule: :setup do
require "resque-scheduler"
Resque.schedule = YAML.load_file(Rails.root.join("config","schedule.yml"))
end
task scheduler: :setup_schedule
end
更新
这个问题似乎与Resque Scheduler有关。如果我从procfile中删除它,我就可以用Docker Compose启动我的应用程序,我可以看到执行resque作业并看到它们正在运行
但是,当手动或由foreman(不使用容器)启动时,调度程序工作正常。因此,我希望在这里也能让它工作。从我的头脑中可以看到一些事情:
version: '3'
services:
app:
build: .
command:
- /bin/bash
- -c
- |
bundle check || bundle install
bundle exec rake db:migrate; rake db:seed
bundle exec foreman start
volumes:
- ./:/code
ports:
- "5000:5000"
depends_on:
- redis
environment:
REDIS_URL: redis://redis --> try better redis://cache
links:
- redis
redis:
image: redis:5.0.5-alpine
最后从这个答案中得到了一个线索: 似乎我需要在设置任务和初始值设定项中设置Resque redis连接。将Resque.redis=redis.current添加到我的Resque.rake安装任务中,最终实现了所有功能:
require "resque/tasks"
require "resque/scheduler/tasks"
task "resque:preload" => :environment
namespace :resque do
task :setup do
require "resque"
Resque.redis = Redis.current
end
task setup_schedule: :setup do
require "resque-scheduler"
Resque.schedule = YAML.load_file(Rails.root.join("config","schedule.yml"))
end
task scheduler: :setup_schedule
end
问题可能是
Procfile
,因为它在所有工作人员启动的文件中被调用,$REDIS\u URL
是完整的URL还是主机名?您将其拼写为URL语法,然后在代码中将其作为主机名传递。@7urkm3n您认为呢mean@DavidMaze错配的好球。我已经更改了它(并更新了问题),但是在本地主机上连接Redis时出现错误:6379
。您能解释一下您在这里更改的内容以及原因吗?我尝试添加链接部分,但遇到了同样的问题。