Docker部署测试应用时无法连接MongoDB数据库报错求助
问题原因及修复方案
核心错误:主机名不匹配
你在docker-compose中定义的MongoDB服务名称为db,Docker Compose内部网络会使用服务名作为DNS解析域名,但是你db.js中的连接URI写的是mongodb://mongo:27017/prueba-docker,mongo这个主机名不存在,所以触发getaddrinfo EAI_AGAIN域名解析失败错误。
修复方式:修改db.js中的连接URI:
// 替换原uri行 const uri = 'mongodb://db:27017/prueba-docker';
次要问题1:服务启动时序问题
depends_on配置只会保证容器的启动顺序,不会等待MongoDB服务初始化完成、可以正常接收连接后再启动后端服务,也可能偶发连接失败问题。
修复方式:修改docker-compose.yml配置,给db服务增加健康检查,让后端服务等待MongoDB健康后再启动:
version: "3" services: prueba-react: image: prueba-react build: ./client/ stdin_open: true ports: - "3000:3000" networks: - mern-app prueba-api: image: prueba-api build: ./server/ ports: - "3400:3400" networks: - mern-app depends_on: db: condition: service_healthy db: image: mongo:4.4-bionic ports: - "27017:27017" networks: - mern-app volumes: - mongo-data:/data/db # 新增健康检查配置 healthcheck: test: ["CMD", "mongo", "--eval", "db.adminCommand('ping')"] interval: 5s timeout: 5s retries: 3 networks: mern-app: driver: bridge volumes: mongo-data: driver: local
次要问题2:Dockerfile路径配置错误
server目录下的Dockerfile中WORKDIR usr/app使用了相对路径,可能引发运行时路径异常。
修复方式:修改为绝对路径:
# 替换原WORKDIR行 WORKDIR /usr/app
最后验证步骤
所有修改完成后,执行以下命令清理旧资源并重新启动:
# 停止并删除旧容器、关联卷 docker-compose down -v # 重新构建镜像并启动服务 docker-compose up --build
启动后查看prueba-api服务日志,出现conected to db即代表连接正常。
内容的提问来源于stack exchange,提问作者Oscar Sanz
相关产品推荐
相关产品推荐

