node.js - 无法通过 Node 应用程序连接到 redis,无论是在 docker 中

标签 node.js docker redis docker-compose ioredis

我正在尝试将我的应用程序连接到 Redis,但我得到:

[ioredis] 未处理的错误事件:错误:连接 ECONNREFUSED 127.0.0.1:6379

当我这样做时:

docker exec -it ed02b7e19810 ping test_redis_1 我已经收到所有数据包。

redis 容器还声明:

* 运行模式=standalone, port=6379

* 准备接受连接

(我收到警告,但我不认为它相关:

警告:未指定配置文件,使用默认配置。为了指定配置文件,请使用 redis-server/path/to/redis.conf

警告:无法强制执行 511 的 TCP 积压设置,因为/proc/sys/net/core/somaxconn 设置为较低的值 128

这是我的 docker-compose.yaml:

version: '3'

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

Docker文件

 FROM node:8.11.2-alpine

 WORKDIR /usr/test-service/

 COPY . /usr/test-service/

 RUN yarn install

 EXPOSE 3000

 CMD ["yarn", "run", "start"]

应用程序.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

最佳答案

对于那个特定的 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 带有一个 reconnection策略,因此您可能想先尝试一下。

你可以在这里看到我对这个问题的回答:

Wait node.js until Logstash is ready using containers

关于node.js - 无法通过 Node 应用程序连接到 redis,无论是在 docker 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50730279/

相关文章:

Node.js REPL 函数文档字符串

javascript - 如何在 Express.js 中添加 Angular 2 应用程序作为 View

javascript - 附加到路径的正确方法是什么?

docker - gitlab-runner docker-machine 错误

django - Openresty : pass a request to FastCGI if data does not found in redis cache 中带有 nginx 的 Lua

ruby-on-rails - ruby rails : How can I get all sessions data from Redis on server side?

node.js - 在 Node 中保存来自 REST POST 调用的数据

amazon-web-services - Docker Swarm关于AWS Cloudformation的说明

docker - APPDATA 在默认的 docker-compose.override 文件中在哪里初始化

python - 如何在tornado中异步写入redis