[英]Mongodb user created with docker-entrypoint-initdb.d doesn't persist in the database
I've been trying to create a user (who is not the administrator) for my database but I can't get it to persist in the database.我一直在尝试为我的数据库创建一个用户(不是管理员),但我无法让它保留在数据库中。
I'm using a sh
init script from the docker-entrypoint-initdb.d
entry point.我正在使用来自
docker-entrypoint-initdb.d
入口点的sh
初始化脚本。 When I run docker-compose up
everything seems to be working.当我运行
docker-compose up
一切似乎都在工作。 But when I try to connect and search for the user it doesn't appear.但是当我尝试连接并搜索用户时,它不会出现。
The log shows:日志显示:
UserNotFound: Could not find user \"john\" for db \"datadb\"
The structure of my project is really simple:我的项目结构非常简单:
docker-compose.yml docker-compose.yml
version: '3.3'
services:
mongodb:
image: mongo:latest
container_name: mongo_db
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: rootpass
MONGO_INITDB_DATABASE: datadb
volumes:
- ./init.d/:/docker-entrypoint-initdb.d/
- mongodbdata:/data/db
restart: always
volumes:
mongodbdata:
driver: local
init-mongo.sh初始化mongo.sh
#!/bin/bash
set -eu
mongo -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD <<EOF
db = db.getSiblingDB('$MONGO_INITDB_DATABASE');
use '$MONGO_INITDB_DATABASE';
db.createUser({
user: 'john',
pwd: '12345',
roles: [{
role: 'readWrite',
db: '$MONGO_INITDB_DATABASE'
}]
});
EOF
Is there anything I'm missing?有什么我想念的吗?
If add show users
after createUser
in init-mongo.sh
, you will find next in docker-compose logs
:如果在
init-mongo.sh
的createUser
之后添加show users
,您将在docker-compose logs
中找到下一个:
mongo_db | {
mongo_db | "_id" : "'datadb'.john",
mongo_db | "userId" : UUID("92abb590-3d2a-44d1-bde4-58b3b3acd1d8"),
mongo_db | "user" : "john",
mongo_db | "db" : "'datadb'",
mongo_db | "roles" : [
mongo_db | {
mongo_db | "role" : "readWrite",
mongo_db | "db" : "datadb"
mongo_db | }
mongo_db | ],
mongo_db | "mechanisms" : [
mongo_db | "SCRAM-SHA-1",
mongo_db | "SCRAM-SHA-256"
mongo_db | ]
mongo_db | }
You could see it becomes "'datadb'.john"
, not "datadb.john"
, that means the database name now is 'datadb'
, not datadb
.你可以看到它变成了
"'datadb'.john"
,而不是"datadb.john"
,这意味着现在的数据库名称是'datadb'
,而不是datadb
。 So should change next line in init-mongo.sh
, not use '$MONGO_INITDB_DATABASE';
所以应该改变
init-mongo.sh
的下一行,而不是use '$MONGO_INITDB_DATABASE';
, but next: ,但接下来:
use $MONGO_INITDB_DATABASE;
Then, docker-compose down -v
(Add -v to remove the volume, so the database will init again when up, with which you could see the effect), and docker-compose up -d
, finally check it:然后,
docker-compose down -v
(加上 -v 删除卷,所以数据库在 up 时会重新初始化,你可以看到效果), docker-compose up -d
,最后检查一下:
> use datadb;
switched to db datadb
> show users;
{
"_id" : "datadb.john",
"userId" : UUID("0e643984-48f9-4da4-a3ea-0e7159240724"),
"user" : "john",
"db" : "datadb",
"roles" : [
{
"role" : "readWrite",
"db" : "datadb"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.