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
相关产品推荐
相关产品推荐

