Как заставить MongoDB переварить файл javascript ПОСЛЕ базовой инициализации базы данных? - PullRequest
0 голосов
/ 07 июня 2019

У меня уже некоторое время работает контейнер MongoDB, и теперь мне нужно вставить некоторые данные в базу данных, не теряя все данные (я мог бы сделать prune system prune --volumes, но это сотрет все данные).

Я написал скрипт, который бы делал все это:

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 голосов
/ 07 июня 2019

Я предполагаю, что ваша БД изначально была создана с другими значениями для MONGO_INITDB_ROOT_USERNAME и / или MONGO_INITDB_ROOT_PASSWORD.

Эти переменные используются только для инициализации пользователя root в новой БД.Пока ваша БД существует, они больше не используются.Как вы уже выяснили, это то же самое для сценариев в docker-entrypoint-initdb.d.

Возможно, именно поэтому ваш db.auth('root','example'); вызов не удался.

Если вы не можете вспомнить учетные данные,Вы можете сбросить пароль root .

...