【问题标题】:Failed to access MongoDB in container through Flask application通过 Flask 应用程序访问容器中的 MongoDB 失败
【发布时间】:2018-11-15 16:48:04
【问题描述】:

各位小伙伴们,希望你们能帮帮我。

所以我现在正在研究 docker 容器,并尝试将我的应用程序(flask+mongodb)移植到两个单独的容器中。 MongoDB 容器已设置好并且运行良好,运行带有链接的 mongoexpress 容器可以让我访问我想要的数据库。现在我移植了我的 Flask 应用程序并且登录页面加载正常(因此 docker 端口本身可以工作)但是即使我运行带有指向我的数据库容器的链接的容器,当我尝试从数据库加载内容时出现服务器错误。

日志给了我以下回溯:

File "/usr/local/lib/python3.7/site-packages/mongoengine/queryset/manager.py", line 37, in __get__
    queryset = queryset_class(owner, owner._get_collection())
File "/usr/local/lib/python3.7/site-packages/mongoengine/document.py", line 190, in _get_collection
    db = cls._get_db()
File "/usr/local/lib/python3.7/site-packages/mongoengine/document.py", line 179, in _get_db
    return get_db(cls._meta.get('db_alias', DEFAULT_CONNECTION_NAME))
File "/usr/local/lib/python3.7/site-packages/mongoengine/connection.py", line 241, in get_db
    db = conn[conn_settings['name']]
File "/usr/local/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1323, in __getitem__
    return database.Database(self, name)
File "/usr/local/lib/python3.7/site-packages/pymongo/database.py", line 107, in __init__
    "of %s" % (string_type.__name__,))
TypeError: name must be an instance of str

所以我的 Flask-MongoEngine 设置如下:

app = Flask(__name__)
app.config["MONGODB_DB"] = 'database-name'
db = MongoEngine(app)

基本上,我的数据库应该在标准端口 27017 上的 localhost 上可用。在将 Flask 连接到容器时,我有什么需要考虑的吗,或者链接是否应该没有按预期公开端口?mongoexpress 可以工作并且可以访问,所以一定是我的设置有问题。

【问题讨论】:

  • 我不太确定下面的答案。你可以在你的烧瓶应用程序中发布配置信息吗?
  • @RobertMoskal 我实际上不知道配置信息是什么。我在哪里可以找到它?
  • 该图像的 WSGI 选项没有改变hub.docker.com/r/tiangolo/uwsgi-nginx-flask
  • how to link container in docker? 的可能重复项我认为您只需要按照其中的说明进行操作即可。或者最好还是使用 docker-compose
  • @RobertMoskal 用户定义的网络是要走的路!在建议之外解决了我的问题。看起来,我的 Flask 配置根本没有被调用。

标签: python mongodb docker flask mongoengine


【解决方案1】:

至少把它放在你的设置中:

app.config['MONGODB_HOST'] = 'mongo'

您的 mongoexpress 工作的原因是它默认在名为 mongo 的主机上查找 mongo,因此当您执行 docker run -it --rm -p 8081:8081 --link YOUR_MONGODB_CONTAINER:mongo mongo-express 时,它可以找到链接的 mongo 实例。但是在flask-mongoengine中,主机默认为localhost。

【讨论】:

  • 好主意!我在 mongoexpress 中的主机似乎是“e63206b1b9b9”,但这也不适用于我的烧瓶应用程序。
  • 你可以试试这个app.config["MONGO_URI"] = "mongodb://mongo:27017/database-name"并删除app.config["MONGODB_*
  • 不成功。所以通过shell我可以访问localhost和“e63206b1b9b9”上的mongod进程。 mongo 不工作。
  • 通过shell访问mongod进程是什么意思? mongo 不工作?
  • "mongo --host localhost" 和 "mongo --host e63206b1b9b9" 确实可以将我连接到 mongo shell(请参阅docs.mongodb.com/manual/mongo)。 “mongo --host mongo”不起作用。
【解决方案2】:

最后事情比我想象的要简单。当我将代码从 Apache2 迁移到 Nginx 时,我的代码流发生了变化,而我没有注意到它。所以我的 Flask 配置行根本没有被调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    相关资源
    最近更新 更多