【问题标题】:Flask with MongoDB Docker Image unable to connect带有 MongoDB Docker Image 的烧瓶无法连接
【发布时间】:2023-03-06 05:36:01
【问题描述】:

我收到服务器超时错误,所以我认为我的 MongoDB 和烧瓶应用程序存在连接错误。

在 docker-compose.yml 中

  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

app.py

def get_db():
    client = MongoClient(host='test_mongodb',
                         port=27017,
                         username='admin',
                         password='password',
                         authSource='admin')
    db = client["staff_db"]
    print("connection good")
    return db


@app.route('/location')
def get_staff_location():
    db = ""
    staffs = []
     try:
        db = get_db()
        _staffs = db.beaconLocation_tb.find()

        for staff in _staffs:
            temp_dict = {
                "id": staffLocation["id"],
                "staffid": staffLocation["staffid"],
                "name": staffLocation["name"]
            }
            staffs.append(temp_dict)
    
        return jsonify({'staff': staffs})
    except:
        pass
    finally:
        if type(db) == MongoClient:
           db.close()

init-db.js

db = db.getSiblingDB("staff_db");
db.staff_tb.drop();

db.staff_tb.insertMany([
    {
        "id":1,
        "staffid": 1,
        "name": "Darren"
    },
    {
        "id": 2,
        "staffid": 2,
        "name": "Tony"
    },
]);

错误信息

pymongo.errors.ServerSelectionTimeoutError: test_mongodb:27017: [Errno -3] 名称解析暂时失败,超时:30s,拓扑描述:]>

任何人都可以看到我犯的错误吗?

【问题讨论】:

  • 你的 Flask 应用程序是否也被 dockerized 并从同一个 docker-compose 文件运行?
  • 是的,但我已经解决了这个问题!谢谢,这只是一个导致 docker-compose 无法正常工作的错误。

标签: python mongodb docker flask docker-compose


【解决方案1】:

hostname: 在 Compose 设置中几乎什么都不做。如果您docker exec 在容器中获取 shell,并且 shell 提示符显示本地主机名,则该设置将更改显示在那里的主机名,但这几乎是它所产生的唯一影响。您通常不需要设置此选项。

反之,Compose 服务名可以用作容器间通信的主机名。此设置在 Docker 文档中的 Networking in Compose 中有进一步描述。

  mongodb:                    # <-- this is a valid host name
    image: mongo:latest
    # hostname: test_mongodb  # <-- does nothing, remove it
    ports:                    # <-- optional and ignored for connections
      - 27017:27017           #     between containers; always use 27017

我建议您通过环境变量配置您的数据库连接信息。请注意,如果您从容器或 Docker 之外的开发环境连接,则连接到此 MongoDB 实例所需的主机名会有所不同。

# If the environment variable is unset (you're running it from a
# non-Docker virtual environment) use a reasonable default for a
# local developer
client = MongoClient(os.environ.get('MONGODB_HOST', 'localhost'), ...)
version: '3.8'
services:
  application:
    build: .
    environment:
      MONGODB_HOST: mongodb  # its Compose service name, not its hostname:

【讨论】:

  • 嗨,感谢您的建议,我已经设法解决了!我也会按照这个来修改!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2016-12-31
  • 2019-07-26
  • 2019-07-13
  • 1970-01-01
相关资源
最近更新 更多