Radonirina Maminiaina
Radonirina Maminiaina

Reputation: 7004

Redis connection failed

I'm building an application which uses Node, redis and mongo. I finished the development, and I want to containerize it with docker.

Here's my Dockerfile:

FROM node:13.8.0-alpine3.11
RUN npm install -g pm2
WORKDIR /user/src/app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000

And here my docker-compose.yml

version: '3'
services:
  redis-server:
    container_name: scrapr-redis
    image: 'redis:6.0-rc1-alpine'
    ports:
      - '6379:6379'
  mongo-db:
    container_name: scrapr-mongo
    image: mongo
    ports:
      - '27017:27017'
    command: --auth
    environment:
      - MONGO_INITDB_ROOT_USERNAME=user
      - MONGO_INITDB_ROOT_PASSWORD=pass
      - MONGO_INITDB_DATABASE=db
  app:
    container_name: scrapr-node
    restart: always
    build: .
    ports:
      - '3000:3000'
      - '3001:3001'
    links:
      - mongo-db
    depends_on:
      - redis-server
    environment:
      - DB_USER=user
      - DB_PWD=pass
      - DB_NAME=db
      - REDIS_HOST=redis-server
    command: 'node index.mjs'

I can start the service successfully, but when node starts, it generates the following error:

Error Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED 127.0.0.1:6379

When I do docker ps -a, I can see that all containers are running:

enter image description here

Why can't it connect with redis? What did I miss?

Upvotes: 1

Views: 1878

Answers (1)

Damo
Damo

Reputation: 6433

127.0.0.1 does not look right to me at all. Let me get the quick checks out of the way first, are you sure you are using the REDIS_HOST env variable in the node app correctly? I would add some console logging to your node app to echo out the env variables to check what they are.

Secondly try attach to the running scrapr-node with docker container exec -it scrapr-node sh or /bin/bash if sh does not work.

Then run nslookup scrapr-redis from the shell, this will give you the ip address of the redis container. if ping scraper-redis returns then you know its an issue with your node app not the docker network.

you can also exec into the redis node and run hostname -I which should show the same ip address as you saw from the other container.

This should help you to debug the issue.

EDIT:

Ensure that you are correctly getting the value from your environment into your node app using process.env.REDIS_HOST and then correctly using that value when connecting to redis something like:

const redisClient = redis.createClient({
  host: process.env.REDIS_HOST,
  port: 6379
});

I would not try and force 127.0.0.1 on the docker network (if that is even possible) it is reserved as the loopback address.

Upvotes: 1

Related Questions