You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redis Docker容器无法向Redis数据库存储数据问题求助

容器环境下Node.js无法向Redis存储数据排查

我通过Docker Compose部署了Node.js应用和Redis两个容器,执行docker-compose up -d --build创建并启动容器后,日志显示Redis连接已建立且可用。登录逻辑需要将用户的refresh token和user id存入Redis,该逻辑在本地非容器环境运行完全正常,但在容器环境下登录时数据无法存入Redis,且无任何报错信息。用console.log查看代码中的Redis变量,显示为undefined。

以下是我的Dockerfile和Docker Compose配置文件,恳请协助排查问题:

Dockerfile

FROM  node:lts-alpine

WORKDIR /app

COPY package*.json ./

COPY client/package*.json client/
RUN npm run install-client --only=production

COPY api/package*.json api/
RUN npm run install-api --only=production

COPY client/ client/
RUN npm run client-build --prefix client

COPY api/ api/

USER node

CMD [ "npm", "start", "--prefix", "api" ]

EXPOSE 5000

docker-compose.yml

version: "3"
services:
  redisdb:
    container_name: redisdb
    hostname: redis
    image: redis
    ports:
      - "6379:6379"

  fullstack-cms:
    build: .
    ports:
      - "5000:5000"
    env_file:
      - ./api/.env
    depends_on:
      - redisdb

排查方向及解决方案

1. 修正Redis连接地址配置

容器环境中不能使用localhost或127.0.0.1连接Redis,Docker Compose会为同一配置文件内的服务分配内部网络域名:

  • 你的Redis服务名为redisdb,同时设置了hostname: redis,因此Node.js代码中Redis连接地址需改为redis或redisdb
  • 检查api/.env文件,确保REDIS_HOST配置为redis(或redisdb),而非本地地址

2. 确保Redis客户端实例正确初始化

Redis变量显示undefined说明客户端实例未创建成功,需检查:

  • 代码是否正确读取环境变量中的Redis配置
  • 是否监听了Redis的错误事件,否则连接失败不会抛出明显报错,示例代码参考:
const redis = require('redis');
const client = redis.createClient({
  host: process.env.REDIS_HOST || 'redis',
  port: process.env.REDIS_PORT || 6379
});

// 必须监听错误事件,才能捕获连接异常
client.on('error', (err) => {
  console.error('Redis连接异常:', err);
});

client.on('connect', () => {
  console.log('Redis连接成功');
});

3. 验证容器间网络连通性

进入Node.js容器测试与Redis的连通性:

# 测试域名解析
docker exec -it fullstack-cms ping redis
# 测试端口连通
docker exec -it fullstack-cms telnet redis 6379

如果不通,检查Docker Compose网络配置,默认同一配置文件内的服务会加入默认网络,若自定义了网络需确保两个服务在同一网络中。

4. 解决depends_on的局限性

depends_on仅保证Node.js容器在Redis容器之后启动,但不保证Redis服务已完全就绪。可通过两种方式处理:

  • 代码中实现Redis连接重试逻辑
  • 使用wait-for-it工具等待Redis就绪后启动Node.js:
    在Dockerfile中添加安装命令:
    RUN npm install -g wait-for-it
    
    修改CMD为:
    CMD ["wait-for-it", "redis:6379", "--", "npm", "start", "--prefix", "api"]
    

5. 查看Redis容器日志

检查Redis容器的详细日志,确认是否收到Node.js的连接请求:

docker logs redisdb

如果日志中没有Node.js的连接记录,说明连接地址配置错误。

内容的提问来源于stack exchange,提问作者user19263124

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:50:22