簡體   English   中英

如何在 docker-compose 上為 mongodb 初始化新用戶和數據庫

[英]How to initialize a new user and database for mongodb on docker-compose

所以,目前我有一個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'
    }
  ]
})

我不知道為什么,但是我每次執行SASL SCRAM-SHA-1 authentication failed for pastime on admin from client 172.19.0.3:55568 ; UserNotFound: Could not find user "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"... SASL SCRAM-SHA-1 authentication failed for pastime on admin from client 172.19.0.3:55568 ; UserNotFound: Could not find user "pastime"...

我懷疑 init 腳本沒有運行,因為我在 mongo 容器中沒有看到有關它的各種日志。

遵循了一些示例,主要是通過以下示例: 如何在啟動時為 MongoDB 容器創建數據庫?

您在上面發布的配置應該可以工作。 我懷疑你可能的安裝之前開始您的容器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片段:

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'
    }
  ]
})

通過 Stack Overflow 與一些帖子有一些對應 - 我認為這個很有趣,並以非常全面的方式添加了一些見解: https : //stackoverflow.com/a/53522699/13232069

重點是在創建新用戶之前需要登錄 admin。 除了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

這種洞察力絕對讓我大開眼界!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM