MongoDB Docker启动事务报错Error 20 IllegalOperation求助
解决本地MongoDB Docker单节点无法运行事务的问题
这个问题我之前也碰到过,核心原因是MongoDB 4.x的事务必须在副本集(或分片集群)环境下才能运行,你当前的Docker配置是单节点实例,不支持事务;而MongoDB Atlas默认采用副本集部署,所以能正常执行事务操作。下面给你一步步的解决方案:
1. 修改Docker Compose配置,启用副本集
更新你的docker-compose.yaml,指定MongoDB 4.4版本镜像,添加副本集启动命令,并挂载初始化脚本:
version: '3' services: database: image: 'mongo:4.4' # 明确指定4.4.x版本,避免自动拉取最新版 container_name: 'mongoDbDev' environment: - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=789512346 - MONGO_INITDB_DATABASE=admin volumes: - ./mongo-volume:/data/db - ./init-replica-set.js:/docker-entrypoint-initdb.d/init-replica-set.js # 挂载副本集初始化脚本 ports: - '27017:27017' command: ["mongod", "--replSet", "rs0", "--bind_ip_all"] # 启动时启用副本集模式
2. 创建副本集初始化脚本
在docker-compose.yaml同目录下创建init-replica-set.js文件,内容如下:
rs.initiate({ _id: "rs0", members: [ { _id: 0, host: "database:27017" } // 使用Docker Compose服务名作为主机名 ] });
3. 调整NestJS的MongoDB连接字符串
修改你的NestJS数据库配置,在连接字符串中指定副本集名称:
// 根据你的实际代码调整,示例配置如下 MongooseModule.forRoot( 'mongodb://root:789512346@localhost:27017/?authSource=admin&replicaSet=rs0' )
4. 处理可能的目录权限问题(可选)
如果之前的目录权限问题还存在,可以先备份数据后重建目录并设置权限:
# 先备份数据(可选) cp -r ./mongo-volume ./mongo-volume-backup # 删除旧目录并重建 rm -rf ./mongo-volume mkdir ./mongo-volume chown -R $USER:$USER ./mongo-volume
5. 启动并验证副本集状态
执行docker-compose up -d启动容器后,等待30秒左右让副本集初始化完成,然后进入容器检查状态:
docker exec -it mongoDbDev mongosh -u root -p 789512346 # 在MongoShell中执行以下命令,查看副本集状态 rs.status()
当输出中stateStr字段显示为"PRIMARY"时,说明副本集初始化完成,此时再测试你的Webhook事务逻辑即可正常运行。
内容的提问来源于stack exchange,提问作者wetidod701
相关产品推荐
相关产品推荐

