Добавьте пароль root и создайте приложение User в контейнере MongoDB Docker при запуске - PullRequest
0 голосов
/ 11 мая 2019

каждый,

Я с трудом настраиваю контейнер MongoDB для получения пароля root и автоматически создаю нового пользователя с меньшими привилегиями (который будет пользователем моего приложения).

В идеале у меня должны быть только некоторые сценарии и конфигурация docker-compose.

Я попытался добавить MONGO_INITDB_ROOT_USERNAME и MONGO_INITDB_ROOT_PASSWORD, но, похоже, они не работают.Они что-то делают, потому что, когда я запускаю такой контейнер, я не могу просто подключиться к оболочке mongo и запустить все команды (а передача имени пользователя и пароля приведет к неавторизованным ошибкам).

Затем я подумал одобавив сценарий на /docker-entrypoint-initdb.d/, но они не запускаются.Они не отображаются на консоли.Кроме того, я просто поместил javascript как этот, и я не уверен, будут ли они работать:

var db = connect("mongodb://localhost/admin");

db.createRole(
    {
        role: "somerole",
        privileges: [
            {
              actions: [ "find", "update", "insert" ],
              resource: { db: "mydb", collection: "" } <--- does it means all colections od database mydb?!?!
            }
          ],
        roles: [  ]
    }
)

db.createUser(
    {
        user: "admin",
        pwd: "adminpass",
        roles: [ { role: "userAdminAnyDatabase", db: "mydb" } ]
    }
)

db.createUser(
    {
        user: "system",
        pwd: "systempass",
        roles: [ { role: "somerole", db: "mydb" } ]
    }
)

Я также хотел бы создавать коллекции и вставлять документы.Как мы это делаем?Разве это не должно быть с точками входа !?

Ответы [ 2 ]

1 голос
/ 12 мая 2019

Документация MongoDb: Справочник по безопасности

Частичный ответ 1

Частичный ответ 2

1) Создайте следующую структуру файлов:

enter image description here

2) Содержимое docker-compose.yml

version: "3"
services:
  mongodb:
    image: "mongo:4.1.1-xenial"
    restart: "unless-stopped"
    env_file:
     - ".env"
    ports:
     - "27017:27017"
    volumes:
     - "./database/data:/data/db"                           # Database files
     - "./database/fixtures:/docker-entrypoint-initdb.d"    # To create Db at start

3)Содержимое default.js

/* Create a New user with "only READ" role */
db = db.getSiblingDB('admin');
db.createUser(
{ 
  "user": "John",
  "pwd": "MyPassword",
  "roles": [
     { "role": "read", "db": "data" } 
  ]
})
/* Misc - Other Data */
db = db.getSiblingDB('data');
db.data.save([
    {
        "name": "Frank",
        "email": "email1@gmail.com",
    },
    {
        "name": "Peter",
        "email": "email2@gmail.com",
    }
  ]);

4) Содержимое .env

MONGO_INITDB_ROOT_USERNAME=Robert
MONGO_INITDB_ROOT_PASSWORD=GoodPassword

5) Перейдите в свой терминал и на уровне файла docker-compose.yml выполните:sudo docker-compose up -d

6) Получить имя контейнера:

Выполнить: sudo docker ps a

7) Перейти внутрь контейнера:

Выполнить: sudo docker exec -it <CONTAINER NAME> bash

8) Внутри контейнера:

Выполнить: mongo --host localhost -u Robert -p GoodPassword --authenticationDatabase admin

ПРИМЕЧАНИЕ: Учтите, что мы указываем «базу данных аутентификации»

9) Выберите базу данных:

Выполните: use admin

10) Показать пользователей (необходимо найти двух пользователей Роберт и Джон):

Выполнить: show users

Как вы можете видеть, внутри каталога "data" хранятся файлы oбаза данных.

И с помощью файла default.js вы можете создавать коллекции с самого начала.

ВАЖНОЕ ПРИМЕЧАНИЕ: Если вы вносите некоторые изменения, которые не отражаются в базе данных,тогда вам нужно УДАЛИТЬ содержимое «data» и запустить снова: docker-compose up -d

Можно сказать, что если каталог «data» не пуст, то файл «default.js» не будет взятво внимание.

0 голосов
/ 12 мая 2019

Я немного изменил вашу конфигурацию, и она работает правильно:

докер-compose.yml:

version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    volumes:
      - ./init.js:/docker-entrypoint-initdb.d/init.js
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
      MONGO_INITDB_DATABASE: mydb

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

init.js:

var db = connect("mongodb://localhost/mydb");

db.createRole(
    {
        role: "somerole",
        privileges: [
            {
              actions: [ "find", "update", "insert" ],
              resource: { db: "mydb", collection: "" }
            }
          ],
        roles: [  ]
    }
)

db.createUser(
    {
        user: "admin",
        pwd: "adminpass",
        roles: [ { role: "somerole", db: "mydb" } ]
    }
)

db.createUser(
    {
        user: "system",
        pwd: "systempass",
        roles: [ { role: "somerole", db: "mydb" } ]
    }
)

Важной частью здесь является первая строка, в противном случае вы создаете роль в базе данных администратора, пока вы ищете ее в базе данных mydb.

С помощью этой настройки я могу запустить базу данных и подключиться к ней.

...