无法通过 Flask 应用程序访问容器中的 MongoDB
Failed to access MongoDB in container through Flask application
伙计们,希望你们能帮助我。
所以我现在正在研究 docker 容器,我尝试将我的应用程序 (flask+mongodb) 移植到两个单独的容器中。 MongoDB 容器已设置并且运行良好,运行 使用 link 连接 mongoexpress 容器使我能够访问我希望的数据库。现在我移植了我的 Flask 应用程序并且登录页面加载正常(所以 docker 端口本身工作)但是即使我 运行 带有 link 的容器到我的数据库容器,我得到一个当我尝试从数据库加载内容时出现服务器错误。
日志给我以下回溯:
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 的本地主机上可用。在将 Flask 连接到容器时,我需要考虑什么吗?或者 link 是否应该没有按预期公开端口?mongoexpress可以正常工作并且可以访问,所以一定是我的设置有问题。
至少把这个放在你的设置中:
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。
最后事情比我想象的要简单。当我将我的代码从 Apache2 迁移到 Nginx 时,我的代码流在我没有注意到的情况下发生了变化。所以我的 Flask 配置行根本没有被调用。
伙计们,希望你们能帮助我。
所以我现在正在研究 docker 容器,我尝试将我的应用程序 (flask+mongodb) 移植到两个单独的容器中。 MongoDB 容器已设置并且运行良好,运行 使用 link 连接 mongoexpress 容器使我能够访问我希望的数据库。现在我移植了我的 Flask 应用程序并且登录页面加载正常(所以 docker 端口本身工作)但是即使我 运行 带有 link 的容器到我的数据库容器,我得到一个当我尝试从数据库加载内容时出现服务器错误。
日志给我以下回溯:
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 的本地主机上可用。在将 Flask 连接到容器时,我需要考虑什么吗?或者 link 是否应该没有按预期公开端口?mongoexpress可以正常工作并且可以访问,所以一定是我的设置有问题。
至少把这个放在你的设置中:
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。
最后事情比我想象的要简单。当我将我的代码从 Apache2 迁移到 Nginx 时,我的代码流在我没有注意到的情况下发生了变化。所以我的 Flask 配置行根本没有被调用。