Создание пользователя mongodb из переменных env

#mongodb #docker #docker-compose #environment-variables

#mongodb #докер #docker-создать #среда-переменные #docker

Вопрос:

Допустим, мы используем docker и docker-compose для нашего приложения flask MongoDB, и нам нужно взаимодействовать с базой данных из приложения flask. Имя пользователя и пароль пользователя базы данных, которые используются для взаимодействия с базой данных, должны быть определены внутри переменных среды, поскольку это наиболее безопасный способ хранения такого рода данных. Мы можем использовать три разные переменные окружения, как показано в изображении mongo docker docs, из которого нам интересны две из этих переменных, MONGO_INITDB_ROOT_USERNAME и MONGO_INITDB_ROOT_PASSWORD . Таким образом мы могли бы определить пользователя root и использовать его в нашем приложении flask, однако это не лучшая практика обеспечения безопасности. Теперь, как указано в документах, мы можем определить другого пользователя с помощью docker-entrypoint-initdb.d/somefile.js , но проблема в том, что я не нашел способа использовать переменные среды внутри файла js, что означает, что если бы я определил переменные, скажем, MONGO_USER и MONGO_PASS внутри docker-compose.yml environemnt раздела, я не смог бы использовать их для создания пользователя базы данных, не являющегося root.

Если бы я мог использовать переменные среды внутри файла js, файл выглядел бы аналогично приведенному ниже.

 db.createUser(
    {
        user: $MONGO_USER,
        pwd: $MONGO_PASS,
        roles: [
            {
                role: "readWrite",
                db: "my_database"
            }
        ]
    }
);
  

Очевидно и, к сожалению, я не могу использовать переменные среды внутри js-файлов подобным образом.

Мой вопрос таков.. Как я могу создать некорневого пользователя с использованием переменных окружения при использовании docker-compse и образа docker mongo? Существуют ли какие-либо более эффективные методы доступа к базе данных MongoDB? Возможно, мне вообще не следует программно создавать пользователя базы данных при запуске контейнера? Должен ли я создавать пользователей вручную, используя учетную запись root после запуска контейнера?

Ответ №1:

Мы попробовали тот же маршрут и в итоге получили пользовательский образ docker, настраивающий учетные записи БД.

Для нашей среды разработки мы создали пользовательский образ docker. С помощью пользовательского скрипта entrypoint создание желаемых пользователей.

Однако это сохранит пароли в изображении и НИКОГДА не должно выполняться для какой-либо общедоступной базы данных. У нас это приемлемо только потому, что этот образ используется только на компьютерах разработчиков. И мы не используем docker в качестве механизма развертывания mongodb вне разработки, поэтому нет риска использования этого образа в производстве.

Dockerfile

 FROM mongo:3.6

RUN mkdir -p /var/lib/mongodb amp;amp; chmod ugo rwx /var/lib/mongodb

COPY entrypoint.sh /
RUN chmod  x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

CMD ["mongod", "--auth", "--smallfiles", "--bind_ip_all", "--dbpath", "/var/lib/mongodb"]
  

entrypoint.sh

 #!/bin/bash
# MongoDB Entrypoint

echo "MongoDB Entrypoint called"

# run mongod WITHOUT auth
mongod --smallfiles --dbpath /var/lib/mongodb amp;
sleep 10

# setup
echo "db.system.version.remove({});" | mongo admin
echo "db.system.version.insert({ '_id' : 'authSchema', 'currentVersion' : 3 });" | mongo admin

# add users
echo "db.createUser({user: 'admin',             pwd: '***', roles: ['root']});"      | mongo admin
echo "db.createUser({user: 'service',           pwd: '***', roles: ['readWrite']});" | mongo service
# echo "db.dropUser('test2');"                                                       | mongo test2

# shutdown server WITHOUT auth
mongod --dbpath /var/lib/mongodb --shutdown

# execute any further commands
exec "$@"