Docker结合bash脚本使用mongoimport认证连接指定MongoDB数据库
问题原因
- 两种写法控制台输出一致、提示输入密码的核心原因是参数解析错误,之前的命令存在参数缺失、URI格式不完整的问题,导致mongoimport没有正确读取传入的认证信息,参数识别错位。
- 第一种独立参数写法的错误:漏了
-d(指定目标数据库)参数,mongoimport按顺序解析参数时,把后续-c传入的集合名mycollection错当成了用户名参数的值,才会报「URI和命令行用户名不一致」的错误。 - 第二种URI写法的错误:URI没有写全端口号,也没有指定
authSource(认证数据库)参数,mongoimport默认会去admin库做认证,解析失败后没有读取到传入的密码,因此提示手动输入密码;同时参数解析逻辑回退到了和第一种写法相同的错位状态,所以输出完全一致。
正确配置方案
两种写法二选一即可,不要混合使用URI和独立认证参数,避免解析冲突。
方案1:独立参数写法(可读性更高,推荐)
注意必须加上-d参数指定目标数据库,--authenticationDatabase填写创建用户时所在的库(如果用户建在admin库就改成admin):
mongoimport \ -h "mongo1:27017" \ -u "user" \ -p "pass" \ -d "mydb" \ -c "mycollection" \ --authenticationDatabase "mydb" \ --type csv \ --file ./latest.csv \ --columnsHaveTypes \ --fieldFile=./field_file_types.txt
对应的import.sh脚本直接替换mongoimport命令即可,Dockerfile不需要修改。
方案2:全URI写法
URI必须写全端口、目标库、认证库参数,不需要额外传-h/-u/-p/-d/--authenticationDatabase这类认证相关参数:
mongoimport \ --uri "mongodb://user:pass@mongo1:27017/mydb?authSource=mydb" \ -c "mycollection" \ --type csv \ --file ./latest.csv \ --columnsHaveTypes \ --fieldFile=./field_file_types.txt
如果直接把集合名也写到URI里,连-c参数都可以省略,URI格式为mongodb://用户名:密码@主机:端口/目标库?authSource=认证库&collection=集合名。
注意事项
- 运行导入容器时,需要保证容器和MongoDB服务在同一个容器网络内,否则无法解析
mongo1主机名,你已确认Mongo服务可正常连接,只要网络配置正确即可。 - 如果你的数据库用户是在admin库下创建的,把
--authenticationDatabase的值、URI里的authSource值改成admin即可。
内容的提问来源于stack exchange,提问作者Inspiraller
相关产品推荐
相关产品推荐

