我正在docker容器中运行mongoDB实例。我试图使用docker exec和--eval选项切换到发出命令。我想要完成的是:
我正在运行的命令如下:
docker exec -it mongo_instance mongo ir --eval "db.adminCommand('use db1'); db.auth("dbuser","dbpassword"); db.storage.drop()"
当我运行此命令时,它始终无法说:
ReferenceError: dbuser is not defined :
我知道的是。该用户位于db1数据库中,我只需切换到该数据库即可使身份验证正常工作。
如果我从mongo shell中运行以下命令,它可以工作:
use ir
db.auth("dbuser","dbpassword")
db.storage.drop()
我有什么想法可以解决这个问题或者完成这件事吗?
提前致谢!
答案 0 :(得分:0)
有differences between interactive and scripted mongo
shell interaction。特别是,use db
之类的语法仅适用于交互式会话。您还可以使用mongo
命令行选项将JavaScript简化为eval,并避免在shell历史记录中使用密码。
假设您的身份验证数据库名称为ir
且要删除的集合为db1.storage
,则建议使用的命令行为:
docker exec -it mongo_instance mongo -u dbuser -p --authenticationDatabase ir --eval“db.getSiblingDB('db1')。storage.drop()”
对此有一些评论:
db.getSiblingDB()
帮助程序是交互式use <db>
语法的脚本等效项。您还可以指定要用作mongo
命令行的一部分的dbname(例如:mongo -u dbuser -p db1 ...
),但db.getSiblingDB('db1')
可能仍然是一个额外的完整性检查,您要删除一个集合来自预期的数据库。mongo
命令行的较短选项为:mongo -u dbuser -p ir --eval "db.storage.drop()"
。 shell使用您要连接的dbname
作为默认的auth数据库。 db.getCollection()
帮助程序,如果您想更加关注集合名称(或者集合名称与内置方法冲突或在JavaScript中无效),这将非常有用。与上面示例相同的是db.getSiblingDB('db1').getCollection('storage').drop()
。-p
(又名--password
)会提示您输入密码,以免在shell历史记录中意外保存。或者,如果您不想保存密码,可以使用-p dbpassword
。