我正在尝试将我的应用程序连接到 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策略,因此您可能想先尝试一下。
你可以在这里看到我对这个问题的回答:
关于node.js - 无法通过 Node 应用程序连接到 redis,无论是在 docker 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50730279/