Docker环境下Express连接MongoDB出现ECONNREFUSED问题求助
问题描述
使用Express应用连接MongoDB时遇到停滞问题,具体情况:
- Express应用配置连接地址为
mongodb://mongodb:27017/myapp - 启动后显示“Adding database support”后停滞,无法继续运行
- 已确认数据库配置无误,且MongoDB实例可通过其他工具访问
- Express和MongoDB均部署在Docker容器中,网络与端口配置符合要求
已尝试重新安装Docker、删除容器和镜像重新部署,问题仍存在。
控制台日志
[+] Running 4/4 ✔ mongodb Pulled 83.6s ✔ 73d21f84dd46 Pull complete 65.4s ✔ express Pulled 95.3s ✔ c9401701e983 Pull complete 54.8s [+] Running 1/3 ✔ Network docker_web_default Created 2.2s ⠦ Container docker_web-mongodb-1 Created 4.6s ⠏ Container docker_web-express-1 Created 1.9s Attaching to express-1, mongodb-1 mongodb-1 | mongodb 12:48:15.14 INFO ==> mongodb-1 | mongodb 12:48:15.14 INFO ==> Welcome to the Bitnami mongodb container mongodb-1 | mongodb 12:48:15.15 INFO ==> Subscribe to project updates by watching https://github.com/bitnami/containers mongodb-1 | mongodb 12:48:15.15 INFO ==> Submit issues and feature requests at https://github.com/bitnami/containers/issues mongodb-1 | mongodb 12:48:15.15 INFO ==> Upgrade to Tanzu Application Catalog for production environments to access custom-configured and pre-packaged software components. Gain enhanced features, including Software Bill of Materials (SBOM), CVE scan result reports, and VEX documents. To learn more, visit https://bitnami.com/enterprise mongodb-1 | mongodb 12:48:15.15 INFO ==> mongodb-1 | mongodb 12:48:15.16 INFO ==> ** Starting MongoDB setup ** mongodb-1 | mongodb 12:48:15.20 INFO ==> Validating settings in MONGODB_* env vars... mongodb-1 | mongodb 12:48:16.77 WARN ==> You set the environment variable ALLOW_EMPTY_PASSWORD=yes. For safety reasons, do not use this flag in a production environment. mongodb-1 | mongodb 12:48:16.79 INFO ==> Initializing MongoDB... mongodb-1 | mongodb 12:48:16.89 INFO ==> Deploying MongoDB from scratch... express-1 | express 12:48:20.95 INFO ==> express-1 | express 12:48:21.02 INFO ==> Welcome to the Bitnami express container express-1 | express 12:48:21.02 INFO ==> Subscribe to project updates by watching https://github.com/bitnami/containers express-1 | express 12:48:21.03 INFO ==> Submit issues and feature requests at https://github.com/bitnami/containers/issues express-1 | express 12:48:21.03 INFO ==> Upgrade to Tanzu Application Catalog for production environments to access custom-configured and pre-packaged software components. Gain enhanced features, including Software Bill of Materials (SBOM), CVE scan result reports, and VEX documents. To learn more, visit https://bitnami.com/enterprise express-1 | express 12:48:21.03 INFO ==> express-1 | express 12:48:21.04 INFO ==> ** Running Express setup ** express-1 | express 12:48:21.06 INFO ==> Validating settings in EXPRESS_* environment variables... express-1 | express 12:48:21.06 WARN ==> EXPRESS_DATABASE_TYPE was not set, the database type will be detected automatically express-1 | express 12:48:21.44 INFO ==> Creating Express application in /app express-1 | express 12:48:23.03 INFO ==> Adding database support mongodb-1 | MongoNetworkError: connect ECONNREFUSED 172.18.0.2:27017 mongodb-1 | mongodb 12:48:26.05 INFO ==> Creating users... mongodb-1 | mongodb 12:48:26.05 INFO ==> Users created mongodb-1 | mongodb 12:48:26.08 INFO ==> Stopping MongoDB... mongodb-1 | mongodb-1 | mongodb 12:48:28.11 INFO ==> ** MongoDB setup finished! ** mongodb-1 | mongodb 12:48:28.15 INFO ==> ** Starting MongoDB **
docker-compose.yml
# Copyright VMware, Inc. # SPDX-License-Identifier: APACHE-2.0 version: '2' services: mongodb: image: docker.io/bitnami/mongodb:7.0 environment: - ALLOW_EMPTY_PASSWORD=yes express: image: docker.io/bitnami/express:4 ports: - '3000:3000' environment: - PORT=3000 - NODE_ENV=development - DATABASE_URL=mongodb://mongodb:27017/myapp - EXPRESS_SKIP_DB_WAIT=0 - EXPRESS_SKIP_DB_MIGRATION=0 - EXPRESS_SKIP_NPM_INSTALL=0 - EXPRESS_SKIP_BOWER_INSTALL=0 volumes: - './my-project:/app' depends_on: - mongodb
可能原因与排查解决步骤
核心原因
从日志可明确:
Express在12:48:23尝试连接MongoDB时,MongoDB仍处于初始化流程(创建用户、重启服务),直到12:48:28才正式启动服务。Docker的depends_on仅保证MongoDB容器启动,不等待内部服务完全就绪,导致Express连接时端口未开放,最终停滞。
排查与解决步骤
优化容器启动依赖逻辑
- 给MongoDB容器添加健康检查,确保服务就绪后再启动Express:
修改docker-compose.yml中mongodb服务配置:
同时修改express的depends_on规则:mongodb: image: docker.io/bitnami/mongodb:7.0 environment: - ALLOW_EMPTY_PASSWORD=yes healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] interval: 5s timeout: 5s retries: 5express: # ...其他配置 depends_on: mongodb: condition: service_healthy - 延长Express等待数据库的超时时间,添加环境变量
EXPRESS_DB_WAIT_TIMEOUT=60(单位秒)
- 给MongoDB容器添加健康检查,确保服务就绪后再启动Express:
验证MongoDB服务状态
- 进入MongoDB容器执行
mongosh --eval "db.adminCommand('ping')",确认服务是否正常响应 - 进入Express容器执行
nc -zv mongodb 27017,测试端口连通性
- 进入MongoDB容器执行
调整连接字符串参数
- 给连接字符串添加超时与重试参数:
mongodb://mongodb:27017/myapp?connectTimeoutMS=30000&retryWrites=true - 尝试追加认证源参数:
&authSource=admin
- 给连接字符串添加超时与重试参数:
查看Express容器详细日志
- 执行
docker logs -f express-1,获取更具体的连接错误信息(如DNS解析、认证失败等)
- 执行
简化MongoDB初始化流程
- Bitnami MongoDB容器创建用户后会重启服务,可提前用初始化脚本创建用户,或使用已初始化完成的镜像,避免启动过程中的端口中断
内容的提问来源于stack exchange,提问作者Eliseo Villa
相关产品推荐
相关产品推荐

