Невозможно аутентифицировать пользователя mongo, созданного с помощью переменных docker env

#mongodb #docker

#mongodb #docker

Вопрос:

Я использую официальный образ mongodb docker с помощью docker-compose. Но я не могу аутентифицироваться с помощью переменных среды MONGO_INITDB_ROOT_USERNAME , MONGO_INITDB_ROOT_PASSWORD . В docker-compose.yaml:

 mongo:
    image: mongo:4.4
    container_name: mongo
    restart: unless-stopped
    tty: true
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: somepass
      MONGO_INITDB_DATABASE: somedb
      SERVICE_TAGS: dev
      SERVICE_NAME: mongo
    ports:
      - "27017:27017"
    volumes:
      - mongodbdata:/data/db
    networks:
      - backend-network
  

После запуска контейнера мне не удалось пройти аутентификацию:

 $ docker exec -it mongo mongo -u root -p somepass --authenticationDatabase somedb
MongoDB shell version v4.4.1
connecting to: mongodb://127.0.0.1:27017/?authSource=somedbamp;compressors=disabledamp;gssapiServiceName=mongodb
Error: Authentication failed. :
connect@src/mongo/shell/mongo.js:374:17
@(connect):2:6
exception: connect failed
exiting with code 1
  

Я не могу понять, что я делаю не так.
Похоже, этот пользователь даже не был создан:

 {"t":{"$date":"2020-10-10T11:23:05.772 00:00"},"s":"I",  "c":"ACCESS",   "id":20249,   "ctx":"conn1","msg":"Authentication failed","attr":{"mechanism":"SCRAM-SHA-1","principalName":"root","authenticationDatabase":"somedb","client":"127.0.0.1:50990","result":"UserNotFound: Could not find user "root" for db "somedb""}}
  

Я также пытался:

  • Удалите переменную env MONGO_INITDB_DATABASE и выполните аутентификацию в базе данных «admin».
  • Создал дополнительного пользователя db.createUser() в файле js, который я поместил в контейнер /docker-entrypoint-initdb.d , затем попытался пройти аутентификацию с этим пользователем.

В обоих случаях я получил одно и то же сообщение об ошибке.

РЕДАКТИРОВАТЬ: когда я не привязываю монтирование /data/db , это работает

Ответ №1:

Вы должны пройти аутентификацию с помощью authenticationDatabase admin .

Из документов:

MONGO_INITDB_ROOT_USERNAME, MONGO_INITDB_ROOT_PASSWORD Эти переменные, используемые совместно, создают нового пользователя и устанавливают пароль этого пользователя. Этот пользователь создается в базе данных аутентификации администратора и получает роль root, которая является ролью «суперпользователя».

docker exec -it mongo mongo -u root -p somepass --authenticationDatabase admin

должно сработать.

Последовательность, которая сработала:

  • Создано следующее docker-compose.yaml :

      mongo:
          image: mongo:4.4
          container_name: mongo
          restart: unless-stopped
          tty: true
          environment:
            MONGO_INITDB_ROOT_USERNAME: root
            MONGO_INITDB_ROOT_PASSWORD: somepass
            MONGO_INITDB_DATABASE: somedb
            SERVICE_TAGS: dev
            SERVICE_NAME: mongo
          ports:
            - "27017:27017"
      
  • Запускался docker-compose up -d в папке, в которой docker-compose.yaml находится

  • Вход в оболочку mongo: docker exec -it mongo mongo -u root -p somepass --authenticationDatabase admin

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

1. Я все еще получаю ту же ошибку. Это работает, только если я удаляю volumes раздел из docker-compose.yaml, понятия не имею, почему

2. это сработало для меня после network удаления раздела, поскольку у меня нет такой сети. mongodata называется volume, он, вероятно, уже содержит данные и docker-compose up , вероятно, завершается сбоем при его запуске. Я обновил свой ответ последовательностью команд, которые должны работать, я бы посоветовал решить проблему аутентификации после успешного docker-compose up завершения, а затем добавить сеть и тома.

3. когда вы удаляете volumes раздел, mongodb данные сохраняются внутри контейнера и начинаются с пустых данных, поэтому это может объяснить, почему вы добились успеха. Когда вы используете именованный том mongodbdata , он может уже содержать данные (включая имя пользователя и пароль базы данных администратора. Вы также должны удалить MONGO_INITDB_DATABASE env. variable, если вы его не используете.