Docker-Compose中Node服务连接Redis遇ENOTFOUND错误求助
以下是针对性的排查步骤:
优先使用Docker Compose服务名称作为Redis主机名
Docker Compose默认会为每个服务创建DNS别名,这个别名就是你在docker-compose.yml里定义的服务名称(比如redis或者redisdb),而非自动生成的容器名称(server-node_redisdb_1这类带项目前缀和序号的名称不是默认可解析域名)。
举个例子,如果你的docker-compose.yml里Redis服务定义如下:services: redisdb: image: redis:latest # 其他配置项 node-app: build: . # 其他配置项那Node服务里Redis的主机名应该写
redisdb,而非任何带项目前缀的容器名称。确认两个服务在同一个Docker网络中
默认Docker Compose会创建全局默认网络,所有服务自动加入该网络。但如果你的docker-compose.yml中手动为服务指定了不同的networks配置,会导致两个服务无法互通。检查配置,确保Node和Redis服务的networks配置一致(或者都不指定,使用默认网络)。验证配置文件是否被正确加载到Node容器
如果你通过本地目录挂载将service-config.json映射到容器内,确认修改的是宿主机对应路径下的文件,且容器内文件已同步更新;如果是构建Node镜像时将配置文件打包进去,修改宿主机文件后需要重新构建镜像(docker-compose build node-app)再启动服务。手动在Node容器内测试DNS解析
进入运行中的Node容器,执行以下命令测试Redis服务的可达性:# 替换成你的Redis服务名称 ping redisdb如果ping不通,说明网络配置存在问题;如果能ping通,说明Node代码的配置读取逻辑有问题——比如硬编码了旧主机名,或者没有正确读取
service-config.json里的值。检查Node连接Redis的代码逻辑
确认代码中确实从service-config.json读取主机配置,而非硬编码。示例代码如下:const config = require('./service-config.json'); const redisClient = require('redis').createClient({ host: config.redis.host, port: config.redis.port || 6379 });可以在代码中添加日志输出,打印实际使用的Redis主机名,确认配置是否生效:
console.log('Redis host being used:', config.redis.host);
内容的提问来源于stack exchange,提问作者Darren

