所以,伙计们,希望你能帮助我。
所以我现在正深入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上可用。当与Flask连接到容器时,我是否需要考虑什么?或者该链接是否未按预期公开端口?mongoexpress可以工作并且具有访问权限,所以我的设置一定有问题。
答案 0 :(得分:0)
至少将它放在您的设置中
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。
答案 1 :(得分:0)
最后,事情比我想象的要简单。当我将代码从Apache2迁移到Nginx时,我的代码流程发生了变化,而没有引起我的注意。因此,我根本没有调用Flask的配置行。