使用docker exec命令切换到不同的Mongo数据库

时间:2018-02-27 18:40:50

标签: mongodb docker

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

  1. 切换到我的数据库
  2. 对数据库进行身份验证
  3. 删除一个集合
  4. 我正在运行的命令如下:

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

    我有什么想法可以解决这个问题或者完成这件事吗?

    提前致谢!

1 个答案:

答案 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