Sidekiq在docker-compose上发生错误,无法连接到127.0.0.1:6379上的Redis(Errno :: ECONNREFUSED)。

54

我试图在Rails中运行sidekiq worker。当我尝试docker-compose up worker时,我收到以下错误:

worker_1 | Error connecting to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED)
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:332:in `rescue in establish_connection'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:318:in `establish_connection'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:94:in `block in connect'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:280:in `with_reconnect'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:93:in `connect'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:351:in `ensure_connected'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:208:in `block in process'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:293:in `logging'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:207:in `process'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:113:in `call'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis.rb:211:in `block in info'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis.rb:57:in `block in synchronize'
worker_1 | /usr/lib/ruby/2.2.0/monitor.rb:211:in `mon_synchronize'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis.rb:57:in `synchronize'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis.rb:210:in `info'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/cli.rb:71:in `block in run'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq.rb:84:in `block in redis'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/connection_pool-2.2.0/lib/connection_pool.rb:64:in `block (2 levels) in with'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/connection_pool-2.2.0/lib/connection_pool.rb:63:in `handle_interrupt'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/connection_pool-2.2.0/lib/connection_pool.rb:63:in `block in with'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/connection_pool-2.2.0/lib/connection_pool.rb:60:in `handle_interrupt'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/connection_pool-2.2.0/lib/connection_pool.rb:60:in `with'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq.rb:81:in `redis'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/cli.rb:68:in `run'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/bin/sidekiq:13:in `<top (required)>'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/bin/sidekiq:23:in `load'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/bin/sidekiq:23:in `<main>'
nyvur_worker_1 exited with code 1

这是我的docker-compose文件:

web: &app_base
  build: .
  ports:
    - "80:80"
  volumes:
    - .:/Nyvur
  command: /usr/bin/start_server.sh
  links:
    - postgres
    - mongo
    - redis
  environment: &app_environment
    SIDEKIQ_CONCURRENCY: 50
    SIDEKIQ_TIMEOUT: 10
    ENABLE_DEBUG_SERVER: true
    RACK_ENV: production
    RAILS_ENV: production

worker:
  build: .
  volumes:
    - .:/Nyvur
  ports: []
  links:
    - postgres
    - mongo
    - redis
  command: bundle exec sidekiq -c 50

postgres:
  image: postgres:9.1
  ports:
    - "5432:5432"
  environment:
    LC_ALL: C.UTF-8
    POSTGRES_DB: Nyvur_production
    POSTGRES_USER: postgres
    POSTGRES_PASSWORD: 3x1mpl3

mongo:
  image: mongo:3.0.7
  ports:
    - "27017:27017"

redis:
  image: redis
  ports:
    - "6379:6379"

我的 Dockerfile

FROM phusion/passenger-customizable
MAINTAINER VodkaMD <support@nyvur.com>
ENV RACK_ENV="production" RAILS_ENV="production"
SECRET_KEY_BASE="e09afa8b753cb175bcef7eb5f737accd02a4c16d9b6e5d475943605abd4277cdf47c488812d21d9c7117efd489d876f34be52f7ef7e88b21759a079339b198ce"
ENV HOME /root
CMD ["/sbin/my_init"]

RUN /pd_build/utilities.sh
RUN /pd_build/ruby2.2.sh
RUN /pd_build/python.sh
RUN /pd_build/nodejs.sh
RUN /pd_build/redis.sh
RUN /pd_build/memcached.sh
RUN apt-get update && apt-get install -y vim nano dialog net-tools build-essential wget libpq-dev git
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# RUN mkdir /etc/nginx/ssl
# RUN openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt
RUN rm -f /etc/service/nginx/down
RUN rm -f /etc/service/redis/down
RUN rm -f /etc/service/sshd/down
RUN rm -f /etc/service/memcached/down
WORKDIR /tmp
ADD Gemfile /tmp/
ADD Gemfile.lock /tmp/
RUN mkdir /home/app/Nyvur
ADD . /home/app/Nyvur
RUN chown -R app:app /home/app/Nyvur
WORKDIR /home/app/Nyvur
RUN bundle install --deployment
RUN bundle exec rake assets:precompile
RUN rm /etc/nginx/sites-enabled/default
COPY config/nginx/nginx_nyvur.conf /etc/nginx/sites-enabled/nginx_nyvur.conf
ADD config/nginx/postgres-env.conf /etc/nginx/main.d/postgres-env.conf
ADD config/nginx/rails-env.conf /etc/nginx/main.d/rails-env.conf
ADD config/nginx/start_server.sh /usr/bin/start_server.sh
RUN chmod +x /usr/bin/start_server.sh
RUN mkdir -p /home/app/Nyvur/tmp/pids
RUN mkdir -p /home/app/Nyvur/tmp/sockets
RUN mkdir -p /home/app/Nyvur/log
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
EXPOSE 80 443 9292

我尝试了不同的配置,检查了其他构建,但问题仍然存在。到目前为止,在 Docker 之外,Sidekiq 运行良好。

8个回答

59

检查Redis服务器是否正在运行,通过在终端中使用以下命令启动Redis:

redis-server

2
是的,我当时还挺天真的,哈哈。我成功地指向了 redis://redis:6379 - whatAboutJohn
很好,每当我在终端中使用“killall -9 ruby”时,我总是会遇到这个问题。 - Bart Hoekstra
我必须确保已经安装了 redis。在 MacPorts 上,我运行了 sudo port install redis 然后运行了 sudo port load redis - GDP2

39
Error connecting to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED)

你的应用程序试图连接其正在运行的容器的本地主机接口,但Redis正在运行在另一个容器中。

修改你的应用程序配置,将redis容器的链接名称(在你的情况下是redis)作为连接的主机名。


3
谢谢!我用Docker环境替换了IP地址,重新启动了一切,现在已经可以正常工作了。 - whatAboutJohn
你在哪里为Docker设置这个配置? - Maxim Zubarev
在启动时实例化Redis(Redis.new)时,我使用ENV['REDIS_PORT_6379_TCP_ADDR'] || '0.0.0.0',以防在Docker之外运行。 - whatAboutJohn
如果在 sidekiq.rb 文件中有 sidekiq_config = { url: ENV['JOB_WORKER_URL'] },请将 JOB_WORKER_URL=redis://redis:6379 添加到您的 .env 文件中以实现它。 - 73k05

14

在 macOS 上(使用 Homebrew),我能够通过运行以下命令来解决这个问题:

brew services start redis

如果您尚未安装Redis,则需要先运行以下命令:

brew install redis

1

我使用以下代码片段解决了这个错误

sudo apt install redis-server

然后通过使用 — 运行 redis-server

redis-server

0

Redis 快速回顾

我遇到了类似的问题,在我的情况下,我有一个启动 Redis 和其他初始设置的脚本,但我忘记运行它。通常会因为 CaS(Tomcat)而中断,但这次是由于 Redis 而中断,我几乎忘记了脚本正在设置 Redis。

无论如何,为了补充其他答案,检查是否存在问题的快速方法是运行

redis-cli

这将让您知道Redis是否正在工作,并帮助您记住是否需要运行它。

如果Redis未运行,则会收到Redis控制台:

redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected>

如果正在运行,您将获得一个 Redis 控制台(交互模式),请参见文档

redis-cli
127.0.0.1:6379>

例如,您可以输入PING,它将返回PONG
redis-cli
127.0.0.1:6379> PING
PONG

运行 Redis Server 时别忘记执行以下操作:

redis-server

-1
如果您正在使用Heroku并遇到此类问题,则需要在您的环境中指定REDIS_PROVIDER_URL。

-1

通过使用redis-server命令启动您的Redis服务器。 启动Sidekiq之后


-1

请确保您的系统已安装Redis服务器:-

 sudo apt install redis-server

这个问题试图连接到另一个容器中的Redis,而该配置已经包含在docker-compose.yml文件中了。在Docker环境中,127.0.0.1也无法访问主机系统。 - David Maze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接