Я создал док-контейнер 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>
Никаких указаний на дополнительных пользователей :( Интересно, должен ли я делать это вручную после этого!
@MostafaHussein В 4.1 вы не можете установить MONGO_INITDB_ROOT_USERNAME и использовать скрипт, так как я могу запустить скрипт? (github.com/docker-library/mongo/blob/master/4.1/… указывает, что скрипты сканируются только в том случае, если две переменные не установлены).
Извините, я не понял. Вы имеете в виду, что не можете использовать MONGO_INITDB_ROOT_USERNAME по своим причинам? Вот почему вы используете скрипт для создания рута и так далее? если это так, я думаю, было бы лучше переопределить точку входа модифицированной, что вы думаете?
Нет, если вы установите переменную, вы не сможете использовать пользовательский скрипт. В любом случае, даже если это сработало, потому что я неправильно понял сценарий точки входа, у меня все еще не создан новый пользователь (тот, что из сценария js). Поэтому, даже если ваше решение сработало для вопроса, на который вы ответили, оно не решит мою проблему, потому что graylog не был создан (база данных или пользователь).
Ну, я хотел установить эти переменные MONGO_INITDB_ROOT_USERNAME и MONGO_INITDB_ROOT_PASSWORD, которые включат аутентификацию db во время процесса создания и запуска контейнера. Затем, определив 3 настраиваемые переменные среды, например GRAYLOG_DB, GRAYLOG_DB_USER и GRAYLOG_DB_PASSWORD, эти переменные будут использоваться в сценарии инициализации для создания базы данных и имени пользователя с назначенным ему паролем, что означает, что я могу использовать для создания базы данных Graylog с пользователем и паролем.
Если я установлю эти переменные, я не получу созданного пользователя или базу данных (graylog). Я не знаю, как я мог бы быть яснее.
Я думаю, вы пропустили эту часть в сценарии инициализации в моем ответе: mongo admin -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD --eval здесь мы использовали переменные для аутентификации, затем мы можем создать базу данных Graylog и пользователя. Я не пробовал с JS, но думаю, можно применить ту же концепцию
Позвольте мне поработать над примером, и я свяжусь с вами после того, как закончу, чтобы прояснить ситуацию.
Пробовал и это (bash), но нет БД с именем Graylog.
К сожалению, оболочка mongo не обрабатывает переменную среды напрямую, однако есть обходной путь, который можно сделать stackoverflow.com/a/55001111/2336650, но я недостаточно знаком с оболочкой mongo, чтобы заставить ее работать, но я предлагаю вам протестировать решение bash, которое у меня есть. рабочий пример здесь: gist.github.com/mostafahussein/83550cd16722101f81c3c2191f3767b2
Спасибо, я попробую это. Есть ли способ в журналах увидеть, что скрипт был выполнен? Потому что я более или менее сделал это, но до сих пор нет базы данных Graylog, когда я делаю list_database_names() с root.
Да, журналы докеров всегда печатают ход выполнения, и пример создания докеров уже работает должным образом, я не уверен, в чем проблема, которая возникает в вашем случае, но если пример не сработал для вас, обновите вопрос с помощью журналов mongodb и убедитесь, что вы удалили все существующие данные, поскольку скрипт инициализации работает только один раз, насколько я знаю
Итак, это должно быть моей подсказкой, я не вижу в журналах тот факт, что он выполняет файлы sh или js, несмотря на то, что они находятся в папке init.d. Я обновлю вопрос сегодня вечером. Большое спасибо за помощь.
Интересно, если я запускаю точку входа вручную (docker-entrypoint.sh mongod), то вижу, что точка входа запущена...



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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