Как создать пользователя в mongodb с помощью docker-compose

Добрый вечер,

Я пытаюсь создать какой-то script, который создаст докер с mongodb и автоматически создаст пользователя.

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

В принципе, вот что мне нужно сделать:

1) очистить/уничтожить контейнер (соединить докер)

2) создайте контейнер-докер с mongodb и запустите его (без параметра -auth)

3) выполните java script, содержащий db.createUser()

4) остановить контейнер

5) перезапустите тот же контейнер с параметром --auth, чтобы разрешить вход в систему с пользователем, созданным в javascript

Я не могу найти, как правильно это сделать с помощью docker-compose, потому что когда он начинается, я должен дать ему команду --auth. Если я это сделаю, я не могу выполнить свой javascript для добавления моего пользователя. MongoDB позволяет создавать пользователей без входа в систему, если нет пользователя, и если параметр -auth не предоставляется.

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

Вот мой проект:

Интеграция-тест/SRC/тест/ресурсы/скрипты/докер-compose.yml

mongodb:
    container_name: mongo
    image: mongo
  ports:
    - "27017:27017"
  volumes:
    - .:/setup
  command: --auth

Интеграция-тест/SRC/тест/ресурсы/скрипты/docker-init.sh

docker-compose down
docker-compose up -d
sleep 1
docker exec mongo bash -c "mongo myDatabase /setup/mongodb-setup.js"

Интеграция-тест/SRC/тест/ресурсы/скрипты/MongoDB-setup.js

db.createUser(
{
    user: "myUser",
    pwd: "myPassword",
    roles: [
      { role: "readWrite", db: "myDatabase" }
    ]
})

Поиск способа начать снова контейнер с новым параметром (в данном случае --auth) поможет, но я не могу найти, как это сделать (запуск docker не принимает параметры).

Любая идея, как я должен делать то, что мне хотелось бы?

Если нет, я все равно могу удалить все из своей базы данных с помощью какого-либо кода Java или что-то еще, но мне нужна полная установка докеры mongodb, созданная с помощью script.

Спасибо!

Ответ 1

EDIT: Репозиторий устарел и больше не поддерживается

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

https://github.com/tutumcloud/mongodb

docker run -d -p 27017:27017 -p 28017:28017 -e MONGODB_USER="user" -e MONGODB_DATABASE="mydatabase" -e MONGODB_PASS="mypass" tutum/mongodb

Вы можете преобразовать эти переменные в переменные окружения docker-compose. Вам не нужно жестко кодировать его.

environment:
    MONGODB_USER: "${db_user_env}"
    MONGODB_DATABASE: "${dbname_env}"
    MONGODB_PASS: "${db_pass}"

Эта конфигурация будет считываться из ваших переменных среды сеанса.

Ответ 2

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

version: '2'
services:
  mongo:
   image: mongo:latest
   container_name: mongo
   ports:
    - "27017:27017"
   volumes:
    - /app/hdp/mongo/data:/data/db

  mongoClientTemp:
   image: mongo:latest
   container_name: mongoClientTemp
   links:
    - mongo:mongo
   command: mongo --host mongo --eval  "db.getSiblingDB('dashboard').createUser({user:'db', pwd:'dbpass', roles:[{role:'readWrite',db:'dashboard'}]});"
   depends_on:
    - mongo

  another-container:
   image: another-image:v01
   container_name: another-container
   ports:
    - "8080:8080"
   volumes:
    - ./logs:/app/logs
   environment:
    - MONGODB_HOST=mongo
    - MONGODB_PORT=27017
   links:
    - mongo:mongo
   depends_on:
    - mongoClientTemp

Ответ 3

Официальное изображение mongo теперь поддерживает следующие переменные среды, которые могут использоваться в компоновке docker, как показано ниже:

environment:
      - MONGO_INITDB_ROOT_USERNAME=user
      - MONGO_INITDB_ROOT_PASSWORD=password
      - MONGO_INITDB_DATABASE=test

больше объяснений на: fooobar.com/questions/456666/...

Ответ 4

После прочтения официальной страницы mongo docker, я обнаружил, что вы можете создать пользователя admin один раз, даже если используется опция auth. Это плохо документировано, но это просто работает (надеюсь, что это не особенность). Поэтому вы можете постоянно использовать параметр auth.

Я создал репозиторий github, в котором скрипты завершают команды, которые будут использоваться. Наиболее важными командами для запуска являются:

docker exec db_mongodb mongo admin /setup/create-admin.js
docker exec db_mongodb mongo admin /setup/create-user.js -u admin -p admin --authenticationDatabase admin

В первой строке будет создан пользователь admin (и mongo не будет жаловаться даже с параметром auth). Вторая строка создаст вашего "обычного" пользователя, используя права администратора от первого.

Ответ 5

добавить параметр --noauth в команду mongo

извлечь из моего файла docker-compose.yml

mongors:
  image: mongo:latest
  command: mongod --noprealloc --smallfiles --replSet mongors2 --dbpath /data/db --nojournal --oplogSize 16 --noauth
  environment:
    TERM: xterm
  volumes:
    - ./data/mongors:/data/db