首页 > 解决方案 > C# Docker MongoDB 30000 毫秒后超时

问题描述

我对 docker 相当陌生,并从中运行 mongo。但是,当我想写入它时遇到以下错误。当我纯粹在本地环境中使用 mongo(即在本地运行 mongodb)时,这非常有效。

我在 docker-compose-test 文件中引用 mongo 的方式如下:

mongo:
    image: mongo
    restart: always
    ports:
       - 27017:27017    
    environment:
       MONGO_INITDB_ROOT_USERNAME: username
       MONGO_INITDB_ROOT_PASSWORD: password

然后在我的 appsettings.config 文件中,我将连接字符串设置如下:

"MongoConnectionString": "mongodb://username:password@localhost:27017"

需要注意的一件事是,我相当肯定这确实会使用这些凭据启动它的一个实例,因为如果我尝试使用带有本地主机主机的 Mongo compass 管理员以及相应的密码和当我的 docker compose 未启动并运行时的用户名,它将无法连接,当它运行时它工作正常。

也就是说,在我的代码中,我引导我的 mongo 上下文如下:

// Create mongo class map
Mapper.CreateMaps();  
                          
string connectionString = configuration.GetValue<string>("ConnectionStrings:MongoConnectionString");

string mongoDataBase = configuration.GetValue<string>("MongoDataBases:MongoDataBaseName");
    
_client = new MongoClient(connectionString);
_database = _client.GetDatabase(mongoDataBase);

然后我尝试将我想要的数据插入到我的集合中(这是它失败的地方),如下所示:


// GetTypedMongoCollection returns a IMongoCollection<T>
var collection = mongoContext.GetTypedMongoCollection<MyCollection>(); 
 

错误信息是:

使用 CompositeServerSelector{ Selectors = MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector, LatencyLimitingServerSelector { AllowedLatencyRange = 00:00:00.0150000 } } 选择服务器 30000 毫秒后发生超时。集群状态的客户端视图是 { ClusterId : "1", ConnectionMode : "Automatic", Type : "Unknown", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "Unspecified/localhost: 27017“}”,端点:“未指定/本地主机:27017”,状态:“断开连接”,类型:“未知”,HeartbeatException:“MongoDB.Driver.MongoConnectionException:打开与服务器的连接时发生异常。--- > MongoDB.Driver.MongoAuthenticationException:无法使用 sasl 协议机制 SCRAM-SHA-1 进行身份验证。---> MongoDB.Driver.MongoCommandException:命令 saslStart 失败:身份验证失败

我注意到它确实提到了“未指定”,这是我认为的问题,但如果是这样,那么将我的连接字符串构建到 mongo 的正确方法是什么?正如我的理解如下:我们有我们的CTX,我们调用GetDatabase,如果它不存在,它将创建数据库,然后当我们调用GetCollection 时,如果它不存在,它应该创建一个集合。我哪里错了?

标签: c#mongodbdockerdocker-compose

解决方案


使用 Docker compose 时,您应该使用“mongo”(撰写文件中的容器名称)而不是 localhost。我刚刚开始工作。

来源:https ://medium.com/@kahana.hagai/docker-compose-with-node-js-and-mongodb-dbdadab5ce0a


推荐阅读