You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PyMongo&Docker Compose跨容器连MongoDB遇域名解析错误求助

解决Docker Compose中容器连接MongoDB的域名解析问题

问题根源

  1. 主机名配置错误:你的Docker Compose里Mongo服务名叫mongo,但环境变量MONGODB_HOSTNAME设成了mongodb,导致容器无法通过DNS解析到Mongo服务。
  2. 冗余配置:Compose v3版本中,同一默认网络下的服务可以直接通过服务名访问,不需要手动配置links。
  3. 启动顺序问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:15:36