no se puede conectar a redis a través de la aplicación de nodo, tanto en dockers

Estoy tratando de conectar mi aplicación a redis, pero me sale:

[ioredis] Unhandled error event: Error: connect ECONNREFUSED 127.0.0.1:6379

Cuando lo hago:

docker exec -it ed02b7e19810 ping test_redis_1 he recibido todos los paquetes.

También el contenedor redis declara:

* Running mode=standalone, port=6379

* Ready to accept connections

(Recibo las ADVERTENCIAS pero no creo que esté relacionado:

Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf

WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128

este es mi docker-compose.yaml:

 version: '3' services: test-service: build: . volumes: - ./:/usr/test-service/ ports: - 5001:3000 depends_on: - redis redis: image: "redis:alpine" 

DockerFile

  FROM node:8.11.2-alpine WORKDIR /usr/test-service/ COPY . /usr/test-service/ RUN yarn install EXPOSE 3000 CMD ["yarn", "run", "start"] 

app.js

 const Redis = require('ioredis'); const redis = new Redis(); redis.set('foo', 'bar'); redis.get('foo').then(function (result) { console.log(result); }); 

También he intentado con el paquete redis pero todavía no puedo conectar:

  var redis = require("redis"), client = redis.createClient(); client.on("error", function (err) { console.log("Error " + err); }); 

consiguiendo:

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

Para ese docker-compose.yml específico no hay redis en 127.0.0.1 , debe usar redis como host, ya que los servicios en la misma red de Docker pueden encontrarse entre sí utilizando los nombres de servicio como DNS.

 const Redis = require('ioredis'); const redis = new Redis({ host: 'redis' }); 

Además , depends_on no espera a que el contenedor de redis esté listo antes de comenzar, solo lo iniciará primero, por lo que es su tarea esperar antes de iniciar app.js o simplemente manejar eso dentro de app.js

io-redis viene con una estrategia de reconexión , por lo que puede intentarlo primero.

Puedes ver mi respuesta aquí con respecto a ese problema:

Espere node.js hasta que Logstash esté listo para usar contenedores