添加 Root 密码并在 MongoDB Docker 容器启动时创建应用程序用户
Add Root password and create Application User on MongoDB Docker container on startup
大家,
我很难设置一个 MongoDB 容器以使用 root 密码并自动创建一个权限较低的新用户(这将是我的应用程序用户)。
理想情况下,我应该只有一些脚本和一个 docker-compose 配置。
我尝试添加 MONGO_INITDB_ROOT_USERNAME 和 MONGO_INITDB_ROOT_PASSWORD,但它们似乎不起作用。他们做了一些事情,因为当我那样启动容器时,我不能只连接到 mongo shell 和 运行 所有命令(并且传递用户名和密码会引发未经授权的错误).
然后我考虑在 /docker-entrypoint-initdb.d/
添加一个脚本,但他们似乎没有 运行。它们不显示在控制台上。此外,我只是像这样放了一个javascript,我不确定它们是否有效:
var db = connect("mongodb://localhost/admin");
db.createRole(
{
role: "somerole",
privileges: [
{
actions: [ "find", "update", "insert" ],
resource: { db: "mydb", collection: "" } <--- does it means all colections od database mydb?!?!
}
],
roles: [ ]
}
)
db.createUser(
{
user: "admin",
pwd: "adminpass",
roles: [ { role: "userAdminAnyDatabase", db: "mydb" } ]
}
)
db.createUser(
{
user: "system",
pwd: "systempass",
roles: [ { role: "somerole", db: "mydb" } ]
}
)
我还想创建集合并插入文档。我们该怎么做?它不应该与入口点一起使用!?
MongoDb Documentation: Security Reference
Partial response 1
1) 创建以下文件结构:
2) docker-compose.yml
的内容
version: "3"
services:
mongodb:
image: "mongo:4.1.1-xenial"
restart: "unless-stopped"
env_file:
- ".env"
ports:
- "27017:27017"
volumes:
- "./database/data:/data/db" # Database files
- "./database/fixtures:/docker-entrypoint-initdb.d" # To create Db at start
3) default.js
的内容
/* Create a New user with "only READ" role */
db = db.getSiblingDB('admin');
db.createUser(
{
"user": "John",
"pwd": "MyPassword",
"roles": [
{ "role": "read", "db": "data" }
]
})
/* Misc - Other Data */
db = db.getSiblingDB('data');
db.data.save([
{
"name": "Frank",
"email": "email1@gmail.com",
},
{
"name": "Peter",
"email": "email2@gmail.com",
}
]);
4) .env 的内容
MONGO_INITDB_ROOT_USERNAME=Robert
MONGO_INITDB_ROOT_PASSWORD=GoodPassword
5) 转到您的终端并在 docker-compose.yml 文件的级别执行:sudo docker-compose up -d
6) 获取容器名称:
执行:sudo docker ps a
7) 进入容器内部:
执行:sudo docker exec -it <CONTAINER NAME> bash
8) 容器内部:
执行:mongo --host localhost -u Robert -p GoodPassword --authenticationDatabase admin
注意: 考虑到我们正在指定 "authentication database"
9) Select 数据库:
执行:use admin
10) 显示用户(您必须找到两个用户 Robert 和 John):
执行:show users
如您所见,"data" 目录中存放着数据库的文件。
并且使用 default.js 文件,您可以从一开始就创建集合。
重要说明:如果您进行了一些更改,但这些更改没有反映到数据库中,那么您需要删除 "data" 和 [=86= 的内容] 再次:docker-compose up -d
可以说,如果"data"目录不为空,那么"default.js"文件将不会被考虑。
我稍微更改了您的配置,它运行正常:
docker-compose.yml:
version: '3.1'
services:
mongo:
image: mongo
restart: always
volumes:
- ./init.js:/docker-entrypoint-initdb.d/init.js
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
MONGO_INITDB_DATABASE: mydb
这里我指定了初始创建的数据库,同时挂载了初始化脚本
init.js:
var db = connect("mongodb://localhost/mydb");
db.createRole(
{
role: "somerole",
privileges: [
{
actions: [ "find", "update", "insert" ],
resource: { db: "mydb", collection: "" }
}
],
roles: [ ]
}
)
db.createUser(
{
user: "admin",
pwd: "adminpass",
roles: [ { role: "somerole", db: "mydb" } ]
}
)
db.createUser(
{
user: "system",
pwd: "systempass",
roles: [ { role: "somerole", db: "mydb" } ]
}
)
这里的重要部分是第一行,否则你在 admin 数据库中创建一个角色,同时在 mydb 数据库中查找它。
通过此设置,我可以启动数据库并连接到它。
大家,
我很难设置一个 MongoDB 容器以使用 root 密码并自动创建一个权限较低的新用户(这将是我的应用程序用户)。
理想情况下,我应该只有一些脚本和一个 docker-compose 配置。
我尝试添加 MONGO_INITDB_ROOT_USERNAME 和 MONGO_INITDB_ROOT_PASSWORD,但它们似乎不起作用。他们做了一些事情,因为当我那样启动容器时,我不能只连接到 mongo shell 和 运行 所有命令(并且传递用户名和密码会引发未经授权的错误).
然后我考虑在 /docker-entrypoint-initdb.d/
添加一个脚本,但他们似乎没有 运行。它们不显示在控制台上。此外,我只是像这样放了一个javascript,我不确定它们是否有效:
var db = connect("mongodb://localhost/admin");
db.createRole(
{
role: "somerole",
privileges: [
{
actions: [ "find", "update", "insert" ],
resource: { db: "mydb", collection: "" } <--- does it means all colections od database mydb?!?!
}
],
roles: [ ]
}
)
db.createUser(
{
user: "admin",
pwd: "adminpass",
roles: [ { role: "userAdminAnyDatabase", db: "mydb" } ]
}
)
db.createUser(
{
user: "system",
pwd: "systempass",
roles: [ { role: "somerole", db: "mydb" } ]
}
)
我还想创建集合并插入文档。我们该怎么做?它不应该与入口点一起使用!?
MongoDb Documentation: Security Reference
Partial response 1
1) 创建以下文件结构:
2) docker-compose.yml
的内容version: "3"
services:
mongodb:
image: "mongo:4.1.1-xenial"
restart: "unless-stopped"
env_file:
- ".env"
ports:
- "27017:27017"
volumes:
- "./database/data:/data/db" # Database files
- "./database/fixtures:/docker-entrypoint-initdb.d" # To create Db at start
3) default.js
的内容/* Create a New user with "only READ" role */
db = db.getSiblingDB('admin');
db.createUser(
{
"user": "John",
"pwd": "MyPassword",
"roles": [
{ "role": "read", "db": "data" }
]
})
/* Misc - Other Data */
db = db.getSiblingDB('data');
db.data.save([
{
"name": "Frank",
"email": "email1@gmail.com",
},
{
"name": "Peter",
"email": "email2@gmail.com",
}
]);
4) .env 的内容
MONGO_INITDB_ROOT_USERNAME=Robert
MONGO_INITDB_ROOT_PASSWORD=GoodPassword
5) 转到您的终端并在 docker-compose.yml 文件的级别执行:sudo docker-compose up -d
6) 获取容器名称:
执行:sudo docker ps a
7) 进入容器内部:
执行:sudo docker exec -it <CONTAINER NAME> bash
8) 容器内部:
执行:mongo --host localhost -u Robert -p GoodPassword --authenticationDatabase admin
注意: 考虑到我们正在指定 "authentication database"
9) Select 数据库:
执行:use admin
10) 显示用户(您必须找到两个用户 Robert 和 John):
执行:show users
如您所见,"data" 目录中存放着数据库的文件。
并且使用 default.js 文件,您可以从一开始就创建集合。
重要说明:如果您进行了一些更改,但这些更改没有反映到数据库中,那么您需要删除 "data" 和 [=86= 的内容] 再次:docker-compose up -d
可以说,如果"data"目录不为空,那么"default.js"文件将不会被考虑。
我稍微更改了您的配置,它运行正常:
docker-compose.yml:
version: '3.1'
services:
mongo:
image: mongo
restart: always
volumes:
- ./init.js:/docker-entrypoint-initdb.d/init.js
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
MONGO_INITDB_DATABASE: mydb
这里我指定了初始创建的数据库,同时挂载了初始化脚本
init.js:
var db = connect("mongodb://localhost/mydb");
db.createRole(
{
role: "somerole",
privileges: [
{
actions: [ "find", "update", "insert" ],
resource: { db: "mydb", collection: "" }
}
],
roles: [ ]
}
)
db.createUser(
{
user: "admin",
pwd: "adminpass",
roles: [ { role: "somerole", db: "mydb" } ]
}
)
db.createUser(
{
user: "system",
pwd: "systempass",
roles: [ { role: "somerole", db: "mydb" } ]
}
)
这里的重要部分是第一行,否则你在 admin 数据库中创建一个角色,同时在 mydb 数据库中查找它。
通过此设置,我可以启动数据库并连接到它。