javascript - Redis连接失败

标签 javascript node.js docker redis

我正在构建一个使用 Node、redis 和 mongo 的应用程序。我开发完成了,想用docker容器化。

这是我的Dockerfile:

FROM node:13.8.0-alpine3.11
RUN npm install -g pm2
WORKDIR /user/src/app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000

这是我的docker-compose.yml

version: '3'
services:
  redis-server:
    container_name: scrapr-redis
    image: 'redis:6.0-rc1-alpine'
    ports:
      - '6379:6379'
  mongo-db:
    container_name: scrapr-mongo
    image: mongo
    ports:
      - '27017:27017'
    command: --auth
    environment:
      - MONGO_INITDB_ROOT_USERNAME=user
      - MONGO_INITDB_ROOT_PASSWORD=pass
      - MONGO_INITDB_DATABASE=db
  app:
    container_name: scrapr-node
    restart: always
    build: .
    ports:
      - '3000:3000'
      - '3001:3001'
    links:
      - mongo-db
    depends_on:
      - redis-server
    environment:
      - DB_USER=user
      - DB_PWD=pass
      - DB_NAME=db
      - REDIS_HOST=redis-server
    command: 'node index.mjs'

我可以成功启动服务,但是当 Node 启动时,它会生成以下错误:

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

当我执行docker ps -a时,我可以看到所有容器都在运行:

enter image description here

为什么无法连接redis?我错过了什么?

最佳答案

127.0.0.1我觉得根本不对。让我先进行快速检查,您确定在 Node 应用程序中正确使用了 REDIS_HOST 环境变量吗?我会向您的 Node 应用程序添加一些控制台日志记录,以回显环境变量以检查它们是什么。

其次尝试使用 docker container exec -it scrapr-node sh 连接到正在运行的 scrapr-node如果 sh 不起作用,则为/bin/bash。

然后运行nslookup scrapr-redis从 shell 中,这将为您提供 redis 容器的 IP 地址。如果ping scraper-redis返回,那么您就知道这是您的 Node 应用程序的问题,而不是 Docker 网络的问题。

您还可以执行到redis Node 并运行hostname -I它应该显示与您从其他容器看到的相同的 IP 地址。

这应该可以帮助您调试问题。

编辑:

确保您使用 process.env.REDIS_HOST 正确地将环境中的值获取到 Node 应用程序中然后在连接到 redis 时正确使用该值,例如:

const redisClient = redis.createClient({
  host: process.env.REDIS_HOST,
  port: 6379
});

我不会尝试在 docker 网络上强制使用 127.0.0.1(如果可能的话),它被保留为环回地址。

关于javascript - Redis连接失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60510096/

相关文章:

javascript - 在新字段中设置值的空格后丢失文本

node.js - Windows 注册表中的 Electron 原子文件类型关联

javascript - clearInterval 不停止间隔

docker - App Engine灵活环境-镜像构建时跳过Dockerfile软件包安装

javascript - 流式不起作用?

Javascript/JQuery POST "url"未定义(未定义)

javascript - 如何消除 Angular 垫按钮切换悬停效果?

node.js - B64图像不以 Angular 显示

docker - 如何设置 micronaut 生成 docker 镜像

nginx - docker-compose run ,链接到之前运行的容器