添加根密码并在启动时在 MongoDB Docker 容器上创建应用程序用户

Vic*_*ira 0 mongodb docker docker-compose docker-entrypoint

每个人,

我很难设置一个 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" } ]
    }
)
Run Code Online (Sandbox Code Playgroud)

我还想创建集合并插入文档。我们该怎么做呢?不应该是有入口点的吗!?

小智 5

MongoDb 文档:安全参考

部分回应 1

部分回应 2

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
Run Code Online (Sandbox Code Playgroud)

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",
    }
  ]);
Run Code Online (Sandbox Code Playgroud)

4).env的内容

MONGO_INITDB_ROOT_USERNAME=Robert
MONGO_INITDB_ROOT_PASSWORD=GoodPassword
Run Code Online (Sandbox Code Playgroud)

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

注意:考虑到我们正在指定“身份验证数据库”

9)选择数据库:

执行:use admin

10)显示用户(必须找到两个用户Robert和John):

执行:show users

正如您所看到的“data”目录中存储了数据库的文件。

使用 default.js 文件,您可以从一开始就创建集合。

重要提示:如果您进行了一些更改并且这些更改没有反映到数据库中,那么您需要删除“data”的内容并再次运行:docker-compose up -d

可以说,如果“data”目录不为空,则“default.js”文件将不会被考虑在内。