Docker Compose部署的MongoDB连接报错topology is connected or connecting如何解决
问题原因及解决方案
1. 修正Docker Compose网络配置
当前db服务未加入自定义的network网络,导致同网络下的app服务无法通过服务名访问MongoDB,需给db服务添加网络配置:
db: image: mongo:latest container_name: mongodb restart: always env_file: - ../configs/config.env ports: - ${MONGODB_PORT:-27017}:27017 environment: MONGO_INITDB_ROOT_USERNAME: ${MONGODB_ROOT_USER:-admin} MONGO_INITDB_ROOT_PASSWORD: ${MONGODB_ROOT_PASSWORD:-admin} volumes: - ../assets/mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh # 新增以下两行配置 networks: - network
2. 修正mongo-init.sh语法错误
初始化脚本中的用户名、密码需要用引号包裹为字符串,否则会被识别为未定义变量,导致业务库用户创建失败,修正后的脚本如下:
use newdb db.createUser( { user: "admin", pwd: "admin", roles: [ { role: "readWrite", db: "newdb" } ] } );
注意:修改初始化脚本后需要删除已生成的MongoDB存量数据(绑定挂载则删除本地数据目录,卷挂载则执行
docker volume rm 对应卷名),再重新启动服务,否则初始化脚本不会二次执行。
3. 补全MongoDB连接URI的鉴权参数
你在newdb库下创建的读写用户,连接时需要显式指定authSource为用户所属的库,否则MongoDB默认到admin库校验鉴权信息,会导致鉴权失败,同时连接后需要调用Ping方法确认连接状态:
import "go.mongodb.org/mongo-driver/mongo/readpref" // 新增newdb库路径和authSource参数 client, err := mongo.Connect(ctx, options.Client().ApplyURI(fmt.Sprintf("mongodb://%s:%s@%s:%s/newdb?authSource=newdb", cfg.DbUsername, cfg.DbPassword, cfg.DbHost, cfg.DbPort))) if err != nil { // 处理连接错误 } // 确认连接已建立完成 if err = client.Ping(ctx, readpref.Primary()); err != nil { // 处理连通性错误 }
额外注意:如果是
app容器内部访问MongoDB,cfg.DbHost需要配置为Docker Compose中MongoDB的服务名db,只有宿主机本地调试时才填localhost。
4. 避免重复初始化客户端
topology is connected or connecting报错核心原因是重复调用mongo.Connect初始化同一个客户端实例,确保全局只初始化一次MongoDB客户端,复用内置连接池即可。
内容的提问来源于stack exchange,提问作者sorohimm
相关产品推荐
相关产品推荐

