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中添加安装命令:
修改CMD为:RUN npm install -g wait-for-itCMD ["wait-for-it", "redis:6379", "--", "npm", "start", "--prefix", "api"]
5. 查看Redis容器日志
检查Redis容器的详细日志,确认是否收到Node.js的连接请求:
docker logs redisdb
如果日志中没有Node.js的连接记录,说明连接地址配置错误。
内容的提问来源于stack exchange,提问作者user19263124
相关产品推荐
相关产品推荐

