数据库基本初始化后,如何使MongoDB消化JavaScript文件?

时间:2019-06-07 09:41:07

标签: javascript mongodb docker mongodb-query admin

一段时间以来,我一直在运行MongoDB容器,现在我需要在不丢失所有数据的情况下向数据库中插入一些数据(我可以做docker system prune --volumes,但这会擦除所有数据)。 / p>

我写了一个脚本,可以完成所有这一切:

db.auth('root', 'example');

    db.createUser(
    {   user: "admin",
        pwd: "admin",
        roles:[{role: "root" , db:"admin"}]})

    db = db.getSiblingDB('dev');

    db.approver.insert({"email":"some@email.com","approverType":"APPROVER"});
    db.approver.insert({"email":"someother@email.com","approverType":"ACCOUNTANCY"});
    db.approver.insert({"email":"another@email.com","approverType":"ACCOUNTANCY"});

我已经扩展了docker-compose,将我的config.js文件复制到docker-entrypoint-initdb.d

重新创建容器并没有执行任何操作,就像脚本未运行。

我发现MongoDB仅在docker-entrypoint-initdb.d中运行脚本一次。

当我尝试使用mongo cli在容器中运行脚本时,得到:

root@038a4fb0736e:/docker-entrypoint-initdb.d# mongo config.js 
MongoDB shell version v4.0.5
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("c21d3faa-93a3-4da1-9a8c-b3ebce178929") }
MongoDB server version: 4.0.5
Error: Authentication failed.
2019-06-07T09:31:31.872+0000 E QUERY    [js] Error: couldn't add user: command createUser requires authentication :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.createUser@src/mongo/shell/db.js:1491:15
@config.js:3:1
failed to load: config.js

有没有办法正确运行此脚本?或授权我创建管理员用户的方法?

docker-compose片段:

  mongodb:
    image: mongo:latest
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
      MONGO_INITDB_DATABASE: dev
    volumes:
      - ./config.js:/docker-entrypoint-initdb.d/config.js
      - mongodbdata:/data/db
    networks:
      mongonetwork:
volumes:
    mongodbdata:
networks:
    mongonetwork:
      external: true

1 个答案:

答案 0 :(得分:0)

我的猜测是,最初为MONGO_INITDB_ROOT_USERNAME和/或MONGO_INITDB_ROOT_PASSWORD创建的数据库具有不同的值。

这些变量仅用于初始化全新DB上的root用户。只要您的数据库存在,就不再使用它们。您已经发现,docker-entrypoint-initdb.d中的脚本也是如此。

这可能是您的db.auth('root','example');通话失败的原因。

如果您忘记了凭据,可以reset the root password