从docker exec命令切换到另一个Mongo数据库

问题描述 投票:0回答:1

我正在docker容器中运行mongoDB实例。我试图使用docker exec和--eval选项切换到发出命令。我想要完成的是:

  1. 切换到我的数据库
  2. 验证到数据库
  3. 删除一个集合

我正在运行的命令如下:

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()

我有什么想法可以绕过这个或完成这个?

提前致谢!

mongodb docker
1个回答
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(aka --password)而不提供密码参数将提示您输入密码,以便它不会被意外保存在您的shell历史记录中。或者,如果您不想保存密码,可以使用-p dbpassword
© www.soinside.com 2019 - 2024. All rights reserved.