我使用的是官方的mongodb docker image和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=somedb&compressors=disabled&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进行身份验证。 - 我在一个js文件中用
db.createUser()
创建了一个额外的用户,我已经把这个js文件放在了/docker-entrypoint-initdb.d
的容器中,然后尝试用这个用户进行身份验证。
我在这两种情况下都得到了相同的错误消息。
**编辑:**当我没有绑定挂载到/data/db
时,它可以工作
2条答案
按热度按时间tsm1rwdh1#
您应该使用
authenticationDatabase admin
进行身份验证。关于docs:
MONGO_INITDB_ROOT_USERNAME,MONGO_INITDB_ROOT_PASSWORD这些变量一起使用,创建一个新用户并设置该用户的密码。此用户是在管理员身份验证数据库中创建的,并被赋予root角色,即“超级用户”角色。
docker exec -it mongo mongo -u root -p somepass --authenticationDatabase admin
应该可以。
成功的顺序:
docker-compose.yaml
:docker-compose.yaml
所在的文件夹中运行docker-compose up -d
docker exec -it mongo mongo -u root -p somepass --authenticationDatabase admin
6l7fqoea2#
我知道这个问题是旧的,但我刚刚有同样的事情发生在我身上。在我身上发生的事情是,我不小心为MongoDB init使用了错误的环境变量,所以它从未创建用户(在我的情况下是mongo/mongo)。
而我像你一样使用
volumes
意味着无论我做了什么(除了从 docker-compose.yml 中删除volumes
,和你一样),它永远不会正确连接到我指定的用户名和密码。所以在你的例子中,你所需要做的就是删除mongodbdata文件夹和/或它的内容,所以下次你运行你的合成,它将重新初始化数据库与新的数据:)。
所以最后,除了使用
authSource=admin
或--authenticationDatabase admin
之外,我还必须这样做。希望这能为其他有这个问题的人节省时间,我刚刚在一个愚蠢的问题上失去了2个小时的生命:)。