#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, если вы его не используете.