【问题标题】:How to initialize a new user and database for mongodb on docker-compose如何在 docker-compose 上为 mongodb 初始化新用户和数据库
【发布时间】:2019-09-06 08:48:48
【问题描述】:

所以,目前我有一个 docker-compose.yml 文件,其中包含以下内容:

version: "2"
services:
 pastime:
   build:
     context: ./pastime
     dockerfile: ./Dockerfile
   volumes:
     - ./pastime:/usr/src/app
     - /usr/src/app/node_modules
   ports:
     - "3000:3000"
   depends_on:
     - mongo
   environment:
     - PORT=3000
     - DATABASE_USER=pastime
     - DATABASE_URL=mongo:27017
     - DATABASE_PASS=pastime123
     - DATABASE_NAME=pastime
   command: npm run start:dev
 mongo:
   image: mongo:latest
   restart: always
   ports:
     - "27017:27017"
   environment:
     - MONGO_INITDB_DATABASE=pastime
     - MONGO_INITDB_ROOT_USERNAME=root
     - MONGO_INITDB_ROOT_PASSWORD=root_password
   volumes:
     - ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro

还有我的init-mongo.js 文件有:

db.createUser({
  user: 'pastime',
  pwd: 'pastime123',
  roles: [
    {
      role: 'readWrite',
      db: 'pastime'
    }
  ]
})

我不知道为什么,但是我每次执行docker-compose logs -f mongo 时得到的输出是: SASL SCRAM-SHA-1 authentication failed for pastime on admin from client 172.19.0.3:55568 ; UserNotFound: Could not find user "pastime"...

我怀疑初始化脚本没有运行,因为我在我的 mongo 容器中没有看到关于它的各种日志。

跟随了几个例子,主要是通过这个: How to create a DB for MongoDB container on start up?

【问题讨论】:

  • 你能在启动时发布容器日志吗?请使用docker-compose down; docker-compose up -d; docker-compose logs -f。快速浏览一下入口点github.com/docker-library/mongo/blob/master/4.2/…,看起来你应该可以工作。我可以看到您没有为 mongo 安装数据卷,但是您是否有机会在最初启动容器后添加 init-mongo.js 文件而不破坏和重新创建它?

标签: mongodb docker docker-compose


【解决方案1】:

您在上面发布的配置应该可以工作。我怀疑您可能在将 init-mongo.js 挂载到 /docker-entrypoint-initdb.d/init-mongo.js 下之前启动了容器,这是错误的结果。

由于您没有为 mongodb 安装数据卷,因此您可以简单地使用以下方法销毁并重新启动容器:

docker-compose down
docker-compose up -d
docker-compose logs -f

我其实很好奇,所以复制了你的配置并成功测试了它。见docker-compose logs -f的sn-p:

mongo_1  | 2019-09-06T15:43:19.982+0000 I  NETWORK  [conn3] received client metadata from 127.0.0.1:46874 conn3: { application: { name: "MongoDB Shell" }, driver: { name: "MongoDB Internal Client", version: "4.2.0" }, os: { type: "Linux", name: "Ubuntu", architecture: "x86_64", version: "18.04" } }
mongo_1  | Successfully added user: {
mongo_1  |  "user" : "pastime",
mongo_1  |  "roles" : [
mongo_1  |      {
mongo_1  |          "role" : "readWrite",
mongo_1  |          "db" : "pastime"
mongo_1  |      }
mongo_1  |  ]
mongo_1  | }

我能够执行到容器中并使用该用户连接到数据库:

$ docker-compose exec mongo bash
root@62ec89743bc0:/# mongo --username pastime --password pastime123 --authenticationDatabase pastime
MongoDB shell version v4.2.0
connecting to: mongodb://127.0.0.1:27017/?authSource=pastime&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("313dd5a9-c417-42c2-b35e-27b301e82def") }
MongoDB server version: 4.2.0
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
    http://docs.mongodb.org/
Questions? Try the support group
    http://groups.google.com/group/mongodb-user
> use pastime
switched to db pastime
>
$ cat docker-compose.yml
version: "2"
services:
  mongo:
    image: mongo:latest
    restart: always
    ports:
      - "27017:27017"
    environment:
      - MONGO_INITDB_DATABASE=pastime
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=root_password
    volumes:
      - ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro

$ cat init-mongo.js
db.createUser({
  user: 'pastime',
  pwd: 'pastime123',
  roles: [
    {
      role: 'readWrite',
      db: 'pastime'
    }
  ]
})

【讨论】:

  • 嘿,leeman,我目前不在,不在我的工作站上,我会尽快测试它!非常感谢,稍后将与您报告我的发现。非常感谢您的帮助和建议!干杯!
  • 嘿@leeman24,在我做了docker-compose downdocker-compose up -d 之后,它起作用了.. 为什么当我做这个序列时它不起作用? 1. docker-compose up --build -d // 构建和构建容器 2. docker-compose logs -f // 查看日志
  • @kyapwc,除非您有可用的history,否则我认为我们不能确定,但​​我的直觉是您最初启动容器时没有安装 init-mongo.js 脚本导致数据库初始化(在容器被销毁之前不会再次发生,因为您没有安装卷)。如果您运行docker-compose down,然后运行docker-compose up --build -d,这应该可以工作。
  • 是的,现在想想,这一切都说得通了。我最初在没有 init-mongo.js 文件的情况下启动了容器,并且仅在启动容器后才添加了该文件。我只是认为当我运行docker-compose up --build -d 时,它会自己运行down 容器,这是我的错误。非常感谢@leeman24 的帮助!真的很感激!向你的队友致敬
【解决方案2】:

通过 Stack Overflow 与几篇文章有一些对应关系 - 我认为这篇文章很有趣,并以非常全面的方式添加了一些见解:https://stackoverflow.com/a/53522699/13232069

重点是在创建新用户之前需要登录管理员。除了docker-compose.yml 文件外,它看起来像(使用 shell 脚本 - 所有功劳归于 x-yuri):

init-mongo.sh:

mongo -- "$MONGO_INITDB_DATABASE" <<EOF
    var rootUser = '$MONGO_INITDB_ROOT_USERNAME';
    var rootPassword = '$MONGO_INITDB_ROOT_PASSWORD';
    var admin = db.getSiblingDB('admin');
    admin.auth(rootUser, rootPassword);

    var user = '$MONGO_INITDB_USERNAME';
    var passwd = '$(cat "$MONGO_INITDB_PASSWORD_FILE")';
    db.createUser({user: user, pwd: passwd, roles: ["readWrite"]});
EOF

或使用 mongo-init.js 文件:

db = db.getSiblingDB('admin');
// move to the admin db - always created in Mongo
db.auth("rootUser", "rootPassword");
// log as root admin if you decided to authenticate in your docker-compose file...
db = db.getSiblingDB('DB_test');
// create and move to your new database
db.createUser({
'user': "dbUser",
'pwd': "dbPwd",
'roles': [{
    'role': 'dbOwner',
    'db': 'DB_test'}]});
// user created
db.createCollection('collection_test');
// add new collection

这种洞察力绝对让我大开眼界!

【讨论】:

  • 感谢您的反馈,我认为这是对问题的回答,并且此链接在此处可以解决问题。它确实对我有很大帮助,所以我认为在这里提及它并没有什么坏处——我对其进行了编辑以使其更具自组织性。希望现在好多了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
相关资源
最近更新 更多