Docker部署MongoDB后连接认证失败问题排查
MongoDB认证失败排查(Docker Compose部署 + Python连接)
问题背景
我用Docker Compose部署了MongoDB 6.0.8,docker-compose.yml中配置了用户认证:
cis_mongodb: container_name: cis_mongodb image: mongo environment: MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER} MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD}
项目根目录下有.env文件,包含MONGO_USER和MONGO_PASSWORD变量。用以下Python代码连接数据库:
import pymongo dbclient = pymongo.MongoClient( f'mongodb://{username}:{password}@{mongo_ip}:{mongo_port}/test', )
运行时出现错误:
pymongo.errors.OperationFailure: Authentication failed., full error: {'ok': 0.0, 'errsg': 'Authentication failed.', 'code': 18, 'codeName': 'AuthenticationFailed'}
已确认用户名密码正确,还尝试过以下连接URL:
f'mongodb://{username}:{password}@{mongo_ip}:{mongo_port}/test' f'mongodb://{username}:{password}@{mongo_ip}:{mongo_port}/test?authSource=admin'
以及参考方案做了转义处理:
import urllib.parse username = urllib.parse.quote_plus('login') password = urllib.parse.quote_plus('password')
请问问题原因可能是什么?
可能的原因及排查方向
- 容器初始化未正确加载.env变量
Docker Compose启动时如果没正确读取.env文件,会导致初始化的管理员账号密码和预期不符。可以进入容器执行mongo -u <你的用户名> -p <你的密码> --authenticationDatabase admin手动验证,或者查看容器启动日志确认初始化时的变量值。 - 认证库参数未生效
虽然加了authSource=admin的URL参数,但可能存在解析问题。建议换用显式参数的连接方式:dbclient = pymongo.MongoClient( host=mongo_ip, port=mongo_port, username=username, password=password, authSource='admin' ) - 特殊字符转义不完整
如果密码包含@、:、/这类特殊字符,转义后要确认是否正确替换到连接字符串中。可以直接打印转义后的用户名和密码,对比是否和.env中的值转义后一致。 - 数据卷残留旧配置
如果之前启动过无认证的MongoDB容器,数据卷里可能残留了未开启认证的旧数据,导致新的认证配置不生效。可以清理数据卷后重新启动:docker-compose down -v docker-compose up -d - pymongo版本不兼容
MongoDB 6.0.8需要对应版本的pymongo支持,旧版本可能存在认证协议兼容问题。升级pymongo到最新兼容版本试试:pip install --upgrade pymongo
内容的提问来源于stack exchange,提问作者user2976612
相关产品推荐
相关产品推荐

