Docker环境下Flask连接MongoDB镜像超时报错问题排查
问题原因
- Docker域名解析失败
报错核心为
test_mongodb主机名无法解析,本质是Flask应用的运行环境无法识别MongoDB的Docker内部主机名:
- 若你直接在本地运行Flask(未放入Docker容器),本地环境没有Docker内部网络的域名解析规则,自然无法访问
test_mongodb- 若你将Flask也通过Docker部署,要确认Flask服务和MongoDB服务在同一个Docker Compose编排网络内,才可以通过主机名互访
- 代码逻辑存在额外错误
初始化脚本创建的集合是
staff_tb,但代码中查询的是不存在的beaconLocation_tb,即便连接成功也拿不到数据;同时循环遍历的变量名存在笔误,你遍历的是staff,取值却用了未定义的staffLocation变量。
解决步骤
- 情况1:Flask在本地直接运行(未跑Docker)
将get_db方法中的MongoDB连接地址改为本地回环地址即可,修改后的代码:
def get_db(): client = MongoClient(host='127.0.0.1', port=27017, username='admin', password='password', authSource='admin') db = client["staff_db"] print("connection good") return db
- 情况2:Flask也通过Docker Compose编排
确认你的docker-compose.yml中已经添加Flask服务的配置,和MongoDB放在同一个配置文件中即可自动共享内部网络,示例配置如下:
version: '3' services: mongodb: image: mongo:latest hostname: test_mongodb environment: - MONGO_INITDB_DATABASE=staff_db - MONGO_INITDB_ROOT_USERNAME=admin - MONGO_INITDB_ROOT_PASSWORD=password volumes: - ./init-db.js:/docker-entrypoint-initdb.d/init-db.js:ro ports: - 27017:27017 # 新增Flask服务配置 flask-app: build: . # 对应你Flask项目的Dockerfile存放路径 ports: - 5000:5000 depends_on: - mongodb
- 修复代码其他问题:
修正集合名、变量名的笔误,同时建议不要吞异常方便后续排查,修改后的接口代码参考:
@app.route('/location') def get_staff_location(): db = None staffs = [] try: db = get_db() _staffs = db.staff_tb.find() # 修改为实际存在的集合名 for staff in _staffs: temp_dict = { "id": staff["id"], # 修正变量名 "staffid": staff["staffid"], "name": staff["name"] } staffs.append(temp_dict) return jsonify({'staff': staffs}) except Exception as e: print(f"接口报错:{e}") finally: if isinstance(db, MongoClient): db.close()
内容的提问来源于stack exchange,提问作者der
相关产品推荐
相关产品推荐

