使用PyMongo&Docker Compose跨容器连MongoDB遇域名解析错误求助
解决Docker Compose中容器连接MongoDB的域名解析问题
问题根源
- 主机名配置错误:你的Docker Compose里Mongo服务名叫
mongo,但环境变量MONGODB_HOSTNAME设成了mongodb,导致容器无法通过DNS解析到Mongo服务。 - 冗余配置:Compose v3版本中,同一默认网络下的服务可以直接通过服务名访问,不需要手动配置
links。 - 启动顺序问题:Backend容器可能在Mongo完全启动就绪前就尝试连接,导致超时失败。
具体修复步骤
1. 修正环境变量中的Mongo主机名
修改docker-compose.yml里的MONGODB_HOSTNAME为服务名mongo,同时移除无用的links配置:
version: '3.7' services: mongo: image: mongo:latest ports: - 27017:27017 backend: build: context: backend command: ["python3", "test.py"] environment: MONGODB_DATABASE: db MONGODB_HOSTNAME: mongo # 改为与Mongo服务名一致
2. 添加健康检查与服务依赖
给Mongo服务添加健康检查,让Backend等待Mongo完全就绪后再启动:
version: '3.7' services: mongo: image: mongo:latest ports: - 27017:27017 healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] interval: 5s timeout: 5s retries: 5 backend: build: context: backend command: ["python3", "test.py"] environment: MONGODB_DATABASE: db MONGODB_HOSTNAME: mongo depends_on: mongo: condition: service_healthy # 等待Mongo健康检查通过
3. 优化Python连接代码(可选)
增加连接超时设置,同时简化代码逻辑,方便调试:
import os from pymongo import MongoClient # 构造Mongo客户端,设置超时时间 client = MongoClient( host=os.environ['MONGODB_HOSTNAME'], port=27017, serverSelectionTimeoutMS=5000 # 缩短超时时间,快速反馈问题 ) # 使用环境变量指定的数据库 db = client[os.environ['MONGODB_DATABASE']] collection = db['data_collection'] data = {'name': 'John'} try: collection.insert_one(data) print("数据插入成功") print(collection) except Exception as e: print(f"连接或插入失败: {e}")
内容的提问来源于stack exchange,提问作者DerDressing
相关产品推荐
相关产品推荐

