Инициализация с новыми пользователями через скрипт js initdb

Я создал док-контейнер mongo с дополнительным js-скриптом:

ADD graylog.js /docker-entrypoint-initdb.d/graylog.js

Скрипт создает двух пользователей:

root = db.getSiblingDB('root');
root.createUser(
  {
    user: "root",
    pwd: "pass",
    roles: [
      { role: "dbOwner", db: "admin" }
    ]
  }
);

graylog = db.getSiblingDB('graylog');
graylog.createUser(
  {
    user: "graylog",
    pwd: "vWGzncmBe9",
    roles: [
      { role: "dbOwner", db: "graylog" }
    ]
  }
);

К сожалению, даже с одним пользователем (первым) подключение БД и вывод списка доступных баз не работает:

client = MongoClient('mongodb://root:pass@localhost:27017/')
client.list_database_names()

Authentication failed

И действительно, в журналах сервера монго я вижу, что root не может войти в систему. graylog не может войти и с graylog сервером.

Я сделал это с совершенно новым/чистым томом и могу подтвердить, что настройка MONGO_INITDB_ROOT_USERNAME/MONGO_INITDB_ROOT_PASSWORD позволяет отображать базы данных.

Документация о том, как это сделать, не очень ясна. mongoldb 3 мог разрешить bth переменные среды и скрипт, но теперь работает только один из них, и только если mongo не инициализирован.

Итак, как я могу установить пользователей из этого скрипта?

Редактировать:

Добавление начальных журналов монго:

2019-03-13T20:01:03.891+0000 I SHARDING [initandlisten] Marking collection local.system.replset as collection version: <unsharded>
2019-03-13T20:01:03.892+0000 I SHARDING [initandlisten] Marking collection admin.system.roles as collection version: <unsharded>
2019-03-13T20:01:03.892+0000 I SHARDING [initandlisten] Marking collection admin.system.version as collection version: <unsharded>
2019-03-13T20:01:03.893+0000 I SHARDING [initandlisten] Marking collection local.startup_log as collection version: <unsharded>
2019-03-13T20:01:03.893+0000 I FTDC     [initandlisten] Initializing full-time diagnostic data capture with directory '/data/db/diagnostic.data'
2019-03-13T20:01:03.894+0000 I SHARDING [initandlisten] Marking collection admin.system.users as collection version: <unsharded>
2019-03-13T20:01:03.894+0000 I SHARDING [initandlisten] Marking collection config.system.sessions as collection version: <unsharded>

Никаких указаний на дополнительных пользователей :( Интересно, должен ли я делать это вручную после этого!

Пожалуйста, обратитесь к следующему ответу, я написал инструкции с примером о том, как создать базу данных с пользователем без полномочий root, который в конечном итоге вы можете использовать для выполнения других операций в контейнере mongodb после его запуска, если есть что-то, что было не ясно, дайте мне знать об этом: stackoverflow.com/a/54967645/2336650

Mostafa Hussein 13.03.2019 00:07

@MostafaHussein В 4.1 вы не можете установить MONGO_INITDB_ROOT_USERNAME и использовать скрипт, так как я могу запустить скрипт? (github.com/docker-library/mongo/blob/master/4.1/… указывает, что скрипты сканируются только в том случае, если две переменные не установлены).

Matthieu Brucher 13.03.2019 00:18

Извините, я не понял. Вы имеете в виду, что не можете использовать MONGO_INITDB_ROOT_USERNAME по своим причинам? Вот почему вы используете скрипт для создания рута и так далее? если это так, я думаю, было бы лучше переопределить точку входа модифицированной, что вы думаете?

Mostafa Hussein 13.03.2019 00:21

Нет, если вы установите переменную, вы не сможете использовать пользовательский скрипт. В любом случае, даже если это сработало, потому что я неправильно понял сценарий точки входа, у меня все еще не создан новый пользователь (тот, что из сценария js). Поэтому, даже если ваше решение сработало для вопроса, на который вы ответили, оно не решит мою проблему, потому что graylog не был создан (база данных или пользователь).

Matthieu Brucher 13.03.2019 00:24

Ну, я хотел установить эти переменные MONGO_INITDB_ROOT_USERNAME и MONGO_INITDB_ROOT_PASSWORD, которые включат аутентификацию db во время процесса создания и запуска контейнера. Затем, определив 3 настраиваемые переменные среды, например GRAYLOG_DB, GRAYLOG_DB_USER и GRAYLOG_DB_PASSWORD, эти переменные будут использоваться в сценарии инициализации для создания базы данных и имени пользователя с назначенным ему паролем, что означает, что я могу использовать для создания базы данных Graylog с пользователем и паролем.

Mostafa Hussein 13.03.2019 00:28

Если я установлю эти переменные, я не получу созданного пользователя или базу данных (graylog). Я не знаю, как я мог бы быть яснее.

Matthieu Brucher 13.03.2019 00:30

Я думаю, вы пропустили эту часть в сценарии инициализации в моем ответе: mongo admin -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD --eval здесь мы использовали переменные для аутентификации, затем мы можем создать базу данных Graylog и пользователя. Я не пробовал с JS, но думаю, можно применить ту же концепцию

Mostafa Hussein 13.03.2019 00:32

Позвольте мне поработать над примером, и я свяжусь с вами после того, как закончу, чтобы прояснить ситуацию.

Mostafa Hussein 13.03.2019 00:34

Пробовал и это (bash), но нет БД с именем Graylog.

Matthieu Brucher 13.03.2019 00:41

К сожалению, оболочка mongo не обрабатывает переменную среды напрямую, однако есть обходной путь, который можно сделать stackoverflow.com/a/55001111/2336650, но я недостаточно знаком с оболочкой mongo, чтобы заставить ее работать, но я предлагаю вам протестировать решение bash, которое у меня есть. рабочий пример здесь: gist.github.com/mostafahussein/83550cd16722101f81c3c2191f376‌​7b2

Mostafa Hussein 13.03.2019 02:03

Спасибо, я попробую это. Есть ли способ в журналах увидеть, что скрипт был выполнен? Потому что я более или менее сделал это, но до сих пор нет базы данных Graylog, когда я делаю list_database_names() с root.

Matthieu Brucher 13.03.2019 10:33

Да, журналы докеров всегда печатают ход выполнения, и пример создания докеров уже работает должным образом, я не уверен, в чем проблема, которая возникает в вашем случае, но если пример не сработал для вас, обновите вопрос с помощью журналов mongodb и убедитесь, что вы удалили все существующие данные, поскольку скрипт инициализации работает только один раз, насколько я знаю

Mostafa Hussein 13.03.2019 10:37

Итак, это должно быть моей подсказкой, я не вижу в журналах тот факт, что он выполняет файлы sh или js, несмотря на то, что они находятся в папке init.d. Я обновлю вопрос сегодня вечером. Большое спасибо за помощь.

Matthieu Brucher 13.03.2019 10:56

Интересно, если я запускаю точку входа вручную (docker-entrypoint.sh mongod), то вижу, что точка входа запущена...

Matthieu Brucher 13.03.2019 21:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
14
288
0

Другие вопросы по теме