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

Docker运行NestJS报getaddrinfo ENOTFOUND redis错误如何解决

NestJS集成Redis报getaddrinfo ENOTFOUND redis修复方案

报错本质是应用运行环境无法通过redis这个主机名找到Redis服务,属于Docker网络+配置错误,按以下步骤修改即可解决:

错误点1:docker-compose.yml配置存在3处问题

  • Redis服务未显式加入和应用相同的自定义桥接网络,Docker的服务名DNS解析仅对同一自定义网络下的容器生效
  • Redis端口映射配置错误:Redis容器默认监听6379端口,原配置"6379:4000"是将宿主机6379端口映射到容器4000端口,属于端口映射写反
  • 未将Redis相关环境变量注入应用容器,也未配置服务启动依赖,容易出现应用启动时Redis还没就绪、环境变量读不到的问题

修正后的docker-compose.yml配置:

version: "3.8"

services:
  partnersusers:
    image: partnersusers
    build:
      context: .
      dockerfile: ./Dockerfile
    environment:
      - RUN_ENV=dev
      - NODE_ENV=development
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      - CACHE_TTL=60 # 替换为实际业务配置的TTL值
      - MAX_ITEM_IN_CACHE=100 # 替换为实际业务配置的最大缓存条数
    ports:
      - "4000:4000"
    depends_on:
      - redis
    networks:
      - default
  redis:
    image: 'redis:alpine'
    ports:
     - "6379:6379"
    networks:
      - default
networks:
  default:
    driver: bridge

如果不想在environment里逐个写环境变量,也可以在partnersusers服务下加env_file: .env,直接加载本地.env文件的配置到容器内。

错误点2:Redis模块环境变量读取方式不统一

原配置在redis.module.ts里混用process.env和ConfigService读取配置,容易因为ConfigModule加载时机问题导致取值异常,统一改成通过ConfigService读取即可:

import { CacheModule, Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { RedisService } from './redis.service';
import * as redisStore from 'cache-manager-redis-store';
import { envVariables } from '../env.variables';

@Module({
  imports: [
    CacheModule.registerAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) => ({
        store: redisStore,
        host: configService.get('REDIS_HOST'),
        port: configService.get('REDIS_PORT'),
        ttl: configService.get('CACHE_TTL'),
        max: configService.get('MAX_ITEM_IN_CACHE'),
      }),
    }),
  ],
  providers: [RedisService],
  exports: [RedisService],
})
export class RedisModule {}

注意:如果本地安装的cache-manager-redis-store版本≥3.0(对应redis客户端4.x版本),配置结构有变更,需要把host、port放到socket字段下,否则还是会出现连接异常:

useFactory: async (configService: ConfigService) => ({
  store: redisStore,
  socket: {
    host: configService.get('REDIS_HOST'),
    port: configService.get('REDIS_PORT'),
  },
  ttl: configService.get('CACHE_TTL'),
  max: configService.get('MAX_ITEM_IN_CACHE'),
})

验证步骤

修改完配置后,先清理旧的容器和网络缓存,再重新构建启动:

docker compose down
docker compose up --build -d

启动后可以进入应用容器执行ping redis,如果能返回Redis容器的IP地址,说明DNS解析正常,服务即可正常连接。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:09:26