Не удается подключиться к Redis через приложение узла, как в докерах - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь подключить свое приложение к Redis, но я получаю:

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

, когда я делаю:

docker exec -it ed02b7e19810 ping test_redis_1 я получилвсе пакеты.

также контейнер redis объявляет:

* Running mode=standalone, port=6379

* Ready to accept connections

(я получаю ПРЕДУПРЕЖДЕНИЯ, но не думаю, чтоэто связано:

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

это мой 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);
});

Я также пробовал с пакетом redis, но все еще не могу подключиться:

 var redis = require("redis"),
     client = redis.createClient();

 client.on("error", function (err) {
     console.log("Error " + err);
 });

Получение:

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

1 Ответ

0 голосов
/ 07 июня 2018

Для этого конкретного docker-compose.yml на 127.0.0.1 нет redis, вы должны использовать redis в качестве хоста, поскольку сервисы в той же сети Docker могут находить друг друга, используя имена сервисов в качестве DNS.

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

Кроме того, depends_on не ожидает готовности контейнера redis перед запуском, он только запускает его сначала, поэтому ваша задача - подождать до запуска app.js или просто обработать его.Внутри app.js

io-redis имеется стратегия пересоединения , так что вы можете попробовать это сначала.

Вы можете увидеть мой ответ здесь относительно этой проблемы:

Подождите, пока node.js не будет готов Logstash с использованием контейнеров

...