尝试创建、从数据库获取数据时失败(pymongo、mongodb、docker-compose)

问题描述 投票:0回答:1

当我尝试在我的 Flask 应用程序中执行 get 或 post 时,出现以下错误。

mongo:27017: [Errno -2] 名称无法解析(配置的超时: socketTimeoutMS:20000.0ms,connectTimeoutMS:20000.0ms),超时: 30s,拓扑描述:]>

我的应用程序.py

from flask import Flask, jsonify
from pymongo import MongoClient
from loguru import logger
from bson.json_util import dumps

app = Flask(__name__)

MONGO_URI = "mongodb://admin:admin@mongo:27017/"

@app.route('/', methods=['GET'])
def get_data():
    try:
        logger.info('Connecting to MongoDB')
        client = MongoClient(MONGO_URI)
        logger.info('Connected to MongoDB')
        db = client.test
        collection = db.test
        data = collection.find({})
        serialized_data = dumps(data)
        logger.info('Data retrieved successfully')
        return jsonify({"data": serialized_data}), 200
    except Exception as e:
        return jsonify({"error": f"{str(e)}"}), 500

@app.route('/', methods=['POST'])
def create_data():
    try:
        logger.info('Connecting to MongoDB')
        client = MongoClient(MONGO_URI)
        logger.info('Connected to MongoDB')
        db = client.test
        collection = db.test
        data = collection.insert_one({"name": "test"})
        logger.info('Data created successfully')
        return jsonify({"data": data}), 200
    except Exception as e:
        return jsonify({"error": f"{str(e)}"}), 500

if __name__ == '__main__':
    app.run(host='0.0.0.0')

docker-compose

version: '3.9'

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "5000:5000"
    depends_on:
      - mongodb
      - nginx

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro

  mongodb:
    image: mongo:latest
    ports:
      - "27017:27017"
    environment:
      - MONGO_INITDB_DATABASE=test
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin
      - MONGO_URI=mongodb://admin:admin@mongodb:27017/test
    volumes:
      - mongodb_data:/data/db

volumes:
  mongodb_data:

表示存在连接错误的错误对我来说没有多大意义,因为正在生成的日志显示请求通过连接线。

有谁知道如何解决吗?

mongodb docker docker-compose pymongo
1个回答
0
投票

Docker 容器通过其服务名称引用;将连接字符串更改为:

MONGO_URI = "mongodb://admin:admin@mongodb:27017/"

请注意,创建

MongoClient
对象实际上并不尝试数据库连接,因此您不能仅仅因为此时没有失败就假设已连接。

© www.soinside.com 2019 - 2024. All rights reserved.