使用docker-compose部署时Web应用无法连接MongoDB的问题求助
解决Docker-Compose中Web应用连接MongoDB失败的问题
从错误日志可以明确:Web应用未读取到配置的MONGODB_URI, fallback到了默认的localhost:27017连接地址,导致连接被拒绝。以下是具体解决步骤:
1. 修复环境变量的空格问题
你的docker-compose.yml中,环境变量定义时等号后存在多余空格,会导致变量值包含前导空格,应用解析时无法正确识别。修改如下:
# 原错误配置 # - MONGODB_NAME= mydb # - MONGODB_URI= mongodb://mydb:mypass@mongohost:27017/mydb # 修改后 - MONGODB_NAME=mydb - MONGODB_URI=mongodb://mydb:mypass@mongohost:27017/mydb
2. 添加MongoDB健康检查,确保服务就绪后启动应用
depends_on仅保证容器启动顺序,不等待MongoDB服务完全就绪。添加健康检查,让应用在MongoDB真正可用后再启动:
在mongohost服务中添加健康检查配置:
services: mongohost: # 其他配置不变 healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] interval: 5s timeout: 5s retries: 5
同时修改my-app的depends_on配置:
my-app: # 其他配置不变 depends_on: mongohost: condition: service_healthy
3. 验证MongoDB初始化脚本的正确性
你的init-mongo.sh逻辑是正确的,但可以通过容器日志确认脚本是否执行成功:
docker logs mongohost
如果看到类似Successfully added user: { user: "mydb", roles: [ "readWrite" ] }的日志,说明初始化正常。
修改后的完整docker-compose.yml示例
version: '2.2' services: mongohost: image: mongo restart: unless-stopped container_name: mongohost hostname: mongohost ports: - "27017:27017" volumes: - ./init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh environment: MONGO_INITDB_ROOT_USERNAME: mydb MONGO_INITDB_ROOT_PASSWORD: mypass MONGODB_INIT_DATABASE: mydb MONGODB_USER: mydb MONGODB_DATABASE: mydb MONGODB_PASS: mypass networks: - mongohost healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] interval: 5s timeout: 5s retries: 5 my-app: image: aws image container_name: my-app hostname: my-app ports: - "8080:8080" environment: - MONGODB_NAME=mydb - MONGODB_URI=mongodb://mydb:mypass@mongohost:27017/mydb depends_on: mongohost: condition: service_healthy networks: - mongohost networks: mongohost: driver: bridge
内容的提问来源于stack exchange,提问作者Gabriele D
相关产品推荐
相关产品推荐

