【问题标题】:Add Root password and create Application User on MongoDB Docker container on startup添加 Root 密码并在启动时在 MongoDB Docker 容器上创建应用程序用户
【发布时间】:2019-09-29 06:21:51
【问题描述】:

大家,

我很难将 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 docker docker-compose docker-entrypoint


    【解决方案1】:

    MongoDb Documentation: Security Reference

    Partial response 1

    Partial response 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
    

    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 &lt;CONTAINER NAME&gt; bash

    8) 容器内:

    执行:mongo --host localhost -u Robert -p GoodPassword --authenticationDatabase admin

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

    9) 选择数据库:

    执行:use admin

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

    执行:show users

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

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

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

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

    【讨论】:

    • 嘿,我可以创建用户,但我无法使用应用程序连接到数据库。它一直在说 John@data(我正在尝试连接到数据数据库)
    • 你能用 COMPASS 连接到数据库吗?您如何尝试连接(指定您的连接命令)?您可以使用第 8 步连接吗?粘贴您的“错误”响应
    • 救命答案,需要把data里面的内容全部删除,修改才生效
    【解决方案2】:

    我对你的配置稍作改动,它运行正常:

    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 数据库中查找它。

    通过此设置,我可以启动数据库并连接到它。

    【讨论】:

      猜你喜欢
      • 2021-06-20
      • 1970-01-01
      • 2019-05-04
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      相关资源
      最近更新 更多