使用身份验证为mongoDB 4.2创建Dockerfile

问题描述 投票:0回答:2

您将如何编写Dockerfile脚本以为mongoDB 4.2创建管理员用户?

是否有一个命令行命令可以创建不使用交互式子外壳的管理员用户? (在mongoDB documentation中看不到任何内容)

感谢您的帮助。

传递MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_PASSWORD不再起作用(已从Docker集线器mongo映像documentation中删除。

[mongo Docker中心文档仅显示交互式shell管理员用户的创建。

> mongo admin

执行mongo交互式shell,但您如何编写shell脚本以从顶级shell在该子shell中输入命令?

FROM mongo

RUN mongo admin ???? db.createUser({ user: 'jsmith', pwd: 'some-initial-password', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });

docker构建过程应显示:

成功添加的用户:{“ user”:“ jsmith”,“角色”:[{“ role”:“ userAdminAnyDatabase”,“ db”:“ admin”}]}

mongodb bash docker authentication dockerfile
2个回答
0
投票

我找到了方法!

  • 使用mongo shell在mongo容器内打开一个shell
    sudo docker exec -it MONGO_CONTAINER mongo admin
  • 切换到管理数据库
    use admin

  • 创建管理员用户
    db.createUser(
      {
        user: "myUserAdmin",
        pwd: passwordPrompt(), // or cleartext password
        roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
      }
    )

  • 创建非管理员用户
    db.createUser({
      user: "toto",
      pwd: "123",
      roles: [
        {
          role: "readWrite",
          db: "tube"
        }
      ]
    });

  • 从Node.js连接到数据库
    mongoose.connect(
      "mongodb://localhost:27017/tube?authSource=admin", 
      {
        useNewUrlParser: true,
        useUnifiedTopology: true,
        auth: {
          user: "toto",
          password: "123"
        }
      }
    );

我尝试将以下init.js文件放入Dockerfile的/docker-entrypoint-initdb.d中:

init.js:

  db.createUser(
      {
        user: "myUserAdmin",
        pwd: passwordPrompt(), // or cleartext password
        roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
      }
    )


Dockerfile:

FROM mongo

COPY ./db/init.js ./docker-entrypoint-initdb.d

运行图像时创建了用户,但无法连接。


0
投票

[确定,这是通过Dockerfile添加认证的方法。

  • 创建init.js文件:
db = new Mongo().getDB("admin");

// create admin user

db.createUser({
  user: "admin",
  pwd: "password",
  roles: [
    {
      role: "userAdminAnyDatabase",
      db: "admin"
    }
  ]
});


// create non admin user

db.createUser({
  user: "toto",
  pwd: "123",
  roles: [
    {
      role: "readWrite",
      db: "tube"
    }
  ]
});


  • 创建Dockerfile:
FROM mongo

# init.js will be executed when the mongo instance runs

COPY ./init.js ./docker-entrypoint-initdb.d
  • 构建您的Docker映像

docker build -t mongoAuth .

  • 运行容器(使用附加模式查看日志)

docker run --name mongoContainer -p 27017:27017 mongoAuth

我在上一个答案中缺少的是,我没有通过使用以下命令来设置用于创建用户的数据库(管理数据库):

db = new Mongo().getDB("admin");

© www.soinside.com 2019 - 2024. All rights reserved.