Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

docker-compose error connecting to redis + sidekiq

I am trying to build a container with docker but I cannot connect sidekiq + redis, the error says sidekiq_1 | Error connecting to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED), seems to sidekiq is trying to connect to localhost but since I am building "in theory" redis + sidekiq + rails + postgres containers is not in the localhost, it should be in redis image.

My docker-compose.yml file is this:

version: '3'

services:
  postgres:
    image: postgres:10.5
    volumes:
      - my_app-postgres:/var/lib/postgresql/data

  redis:
    image: redis:4.0.11
    volumes:
      - my_app-redis:/var/lib/redis/data

  web:
    build: .
    command: bundle exec rails server -p 3000 -b '0.0.0.0'
    ports:
      - '3000:3000'
    depends_on:
      - postgres
      - redis
    volumes:
      - .:/my_app
    env_file:
      - .env

  sidekiq:
    build: .
    command: bundle exec sidekiq -C config/sidekiq.yml
    volumes:
      - .:/my_app
    depends_on:
      - postgres
      - redis
    env_file:
      - .env

volumes:
  my_app-postgres:
  my_app-redis:

another interesting 'info' I see in log is Booting Sidekiq 4.2.10 with redis options {:url=>nil} this url can be the cause of the issue?

in my development environment the app is working fine, I try to 'dockerize' what I have. How could I make this work?

like image 947
Carlos Gómez Avatar asked Dec 18 '22 20:12

Carlos Gómez


2 Answers

By default, sidekiq tries to connect to 127.0.0.1:6379 but your sidekiq is in a different container than redis, so you need to configure sidekiq to use redis:6379 as redis host, e.g. by using an initializer:

 Sidekiq.configure_server do |config|
  config.redis = { url: 'redis://redis:6379/12' }
 end

Take a look at the docs for more details: https://github.com/mperham/sidekiq/wiki/Using-Redis

If you are planning on using Kubernetes for deployment later on, you can put all containers in a pod and then they would be able to connect via localhost because containers within the same Kubernetes pod share the network space. To program directly within a pod inside a Kubernetes cluster, you could work with a tool I recently open sourced on GitHub called DevSpace: https://github.com/covexo/devspace

like image 182
Lukas Gentele Avatar answered Dec 27 '22 18:12

Lukas Gentele


Create two initializer files:

i) redis.rb

uri = "redis://#{ENV['REDIS_URL']}:#{ENV['REDIS_PORT']}/0/your-app-cache" || 'redis://localhost:6379/0/your-app-cache'

Rails.application.config.cache_store = :redis_store, uri

ii) sidekiq.rb

Sidekiq.configure_server do |config|
  config.redis = { url:  "redis://#{ENV['REDIS_URL']}:#{ENV['REDIS_PORT']}/12" }
end

Sidekiq.configure_client do |config|
  config.redis = { url:  "redis://#{ENV['REDIS_URL']}:#{ENV['REDIS_PORT']}/12" }
end
like image 44
Akshay Goyal Avatar answered Dec 27 '22 16:12

Akshay Goyal