#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 "$@"