docker-compose создать контейнер mongo с именем пользователя и паролем

#mongodb #authentication #docker-compose

#mongodb #аутентификация #docker-compose

Вопрос:

У меня создается контейнер mongo в Compose:

 version: '2'
volumes:
  mongodata:
    driver: local
services:
  mongo:
    image: mongo:latest
    hostname: ${MONGODB_HOST}
    restart: always
    ports: 
      - "27017:27017"
    volumes:
      - mongodata:/data/db
  

Это работает отлично, однако теперь я хочу ввести пароль в базу данных. Для этого, во-первых, насколько я понимаю, мне нужно создать базу данных, добавить пароль, а затем перезапустить ее с --auth помощью флага. Мой вопрос в том, как выполнить этот процесс с помощью docker-compose.

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

a) docker-compose работает внутри сети docker. b) docker-compose не может запускать разные команды в начале, как во время производства. — это важно, потому что, хотя некоторые люди говорят, что вы можете запустить --auth в начале, и это позволит вам установить пароль в первый раз, похоже, это не так.

Одним из решений, над которым я начал работать, был сценарий оболочки, который я запускал на всех своих серверах перед запуском файла docker-compose:

 # start the temporary container
docker run -d -v /tmp/mongodb --name tmpdb -e MONGODB_DBNAME=db_test mongo --auth
# do the user creation
docker run -it --link tmpdb --rm mongo sh -c 'mongo --host tmpdb --eval "db.createUser({ user: "admin", pwd: "password", roles: [ { role: "root", db: "admin" } ] });"'
# stop the server
docker stop tmpdb
# create new mongodb container, using the old ones data
docker run -d -p 27017:27017 --name mongo2 -e MONGODB_DBNAME=db_test mongo --auth
# clean up old container (we are using the volumes so they will stick around)
docker rm tmpdb
  

Этот файл создает временный контейнер, устанавливает для него имя пользователя / пароль, останавливает исходный контейнер, создает новый, используя старый контейнер тома, и удаляет исходный. В новом контейнере mongo теперь включен пароль.

Итак, мой окончательный вопрос: как лучше всего сделать это в docker-compose?

Мои другие контейнеры в моем файле docker-compose должны иметь доступ к mongo, поэтому я думаю, что контейнер тома, содержащий данные mongo, должен находиться в той же сети, которую создает docker-compose

Ответ №1:

Монго: последнее изображение на момент написания (версия 3.5) принимает две переменные среды, MONGO_INITDB_ROOT_USERNAME и MONGO_INITDB_ROOT_PASSWORD .

Когда они будут установлены, скрипт entrypoint контейнера запустит службу mongod с помощью —auth, а затем создаст пользователя-администратора с предоставленными учетными данными.

В настоящее время это не задокументировано в их README , но есть проблема GitHub, отслеживающая прогресс в этом вопросе, и источник доступен в строке 104 docker-entrypoint.sh сценарий.

Чтобы использовать эти переменные в вашем docker-compose.yml , см. Следующий фрагмент:

 version: '3'
services:
  mongodb:
    image: mongo:3.5
    hostname: ${MONGODB_HOST}
    environment:
      - MONGO_INITDB_ROOT_USERNAME=alice
      - MONGO_INITDB_ROOT_PASSWORD=super-secret-password
    restart: on-failure
    ports:
      - 27017:27017
    volumes:
      - ./mongodb:/data/db
  

Комментарии:

1. Привет! Есть ли способ запустить Mongo с помощью —auth без создания пользователя-администратора?

2. @Muskan попробуйте удалить environment: раздел и добавить command: mongod --auth

3. ммм .. извините, но я не думаю, что это сработало, но это сработало: command: [—auth]

4. @Muskan да, вы можете смонтировать том с помощью mongodb.conf authorization: true , установив.

5. Как заставить это работать с уже существующей базой данных? Например. Я хочу ввести аутентификацию через compose file, но база данных уже существовала из предыдущей службы?