0

I am trying to containerize a nodejs application. The application runs fine on a node container that I manually install and run redis on, but when I try to run the app in a container using my docker-compose file, I get an error:

"Error Error: Redis connection to localhost:6379 failed - connect ECONNREFUSED 127.0.0.1:6379".

I will post my docker-compose.yml and dockerfile below as well as the console log when I try and execute docker-compose up.

FROM node:8-jessie

WORKDIR /var/api-console

COPY package*.json ./
RUN npm install

COPY . . /var/api-console/

RUN apt-get update
RUN apt-get install python

EXPOSE 3000
version: '3'
services:
  redis:
    image: redis
    ports:
      - "6379:6379"
    command:
      redis-server
    networks:
      - webnet
  app:
    build: ./
    volumes:
      - ./:/var/api-console
    ports:
      - 3000:3000
    command:
      node app.js
    networks:
      - webnet
networks:
  webnet:
AIDEVERSUSCATCH:api-console evan.dhillon$ docker-compose up
WARNING: The Docker Engine you're using is running in swarm mode.

Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.

To deploy your application across the swarm, use `docker stack deploy`.

Starting api-console_app_1   ... done
Starting api-console_redis_1 ... done
Attaching to api-console_app_1, api-console_redis_1
redis_1  | 1:C 04 Jun 2019 03:12:27.660 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 04 Jun 2019 03:12:27.660 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 04 Jun 2019 03:12:27.660 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1  | 1:M 04 Jun 2019 03:12:27.661 * Running mode=standalone, port=6379.
redis_1  | 1:M 04 Jun 2019 03:12:27.661 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1  | 1:M 04 Jun 2019 03:12:27.661 # Server initialized
redis_1  | 1:M 04 Jun 2019 03:12:27.661 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
redis_1  | 1:M 04 Jun 2019 03:12:27.661 * DB loaded from disk: 0.000 seconds
redis_1  | 1:M 04 Jun 2019 03:12:27.661 * Ready to accept connections
app_1    | Express server listening on port 3000
app_1    | Error Error: Redis connection to localhost:6379 failed - connect ECONNREFUSED 127.0.0.1:6379
app_1    | Error AbortError: Redis connection lost and command aborted. It might have been processed.
app_1    | events.js:183
app_1    |       throw er; // Unhandled 'error' event
app_1    |       ^
app_1    | 
app_1    | Error: Redis connection to localhost:6379 failed - connect ECONNREFUSED 127.0.0.1:6379
app_1    |     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1191:14)
api-console_app_1 exited with code 1

1 Answer 1

2

This line in your log explains the connection failure

Redis connection to localhost:6379 failed

The node application is expecting the redis to be on the localhost, which it is not.

You can provide the address of the redis container to your node app via environment variable.

Also add a depends_on in app service to make it wait on redis service. The modified compose file below

version: '3'
services:
  redis:
    image: redis
    ports:
      - "6379:6379"
    command:
      redis-server
    networks:
      - webnet
  app:
    build: ./
    volumes:
      - ./:/var/api-console
    ports:
      - 3000:3000
    depends_on:
      - redis
    environment:
      redis_server_addr: redis   
      #The dependent service address is set in environment variable which you can use in your app to connect
    command:
      node app.js
    networks:
      - webnet
networks:
Sign up to request clarification or add additional context in comments.

6 Comments

Also, you need to change the application configuration to connect to redis not on localhost but use host as redis.
I tried running with the docker-compose posted above, and changed the host to "redis" in config.json but I still get the same error. Is there anything inside of the app itself that needs to be modified?
Something like this in your application code const port = 6379 const host = process.env.redis_server_addr; var client = redis.createClient(port, host);
Thanks for the help. I added those variables and fixed the two calls to match redis.createClient(port, host) in app.js. Still getting the same error. Any other solutions to try? @asolanki
I resolved the issue, after making your changes, when I ran a docker-compose up, it wasn't actually rebuilding the nodejs project and was instead drawing from the cache. after runnning a docker-compose build, the config.json was updated with redis and the issue resolved
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.