我正在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()
我有什么想法可以绕过这个或完成这个?
提前致谢!
有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
(aka --password
)而不提供密码参数将提示您输入密码,以便它不会被意外保存在您的shell历史记录中。或者,如果您不想保存密码,可以使用-p dbpassword
。