Buat pengguna baru untuk MongoDB di dalam Docker

Saya menggunakan gambar buruh pelabuhan MongoDB default dan saya mencoba membuat pengguna baru untuk database.

Saat ini saya mencoba melakukannya dengan cara ini:

FROM docker.io/mongo:3.2MAINTAINER <alexandernst> alexandernst@gmail.comADD create_ddbb.js /tmp/RUN mongod --fork --logpath /var/log/mongodb.log \    && sleep 5 && mongo foobar /tmp/create_ddbb.js 

Dan create_ddbb.js:

db.createUser(    {      user: "*******",      pwd: "*******************",      roles: [         { role: "readWrite", db: "foobar" }      ]    });

Dan ketika saya membangun Dockerfile, saya melihat:

Step 4 : RUN mongod --fork --logpath /var/log/mongodb.log       && sleep 5 && mongo foobar /tmp/create_ddbb.js ---> Running in 58ba44d02508about to fork child process, waiting until server is ready for connections.forked process: 9child process started successfully, parent exitingMongoDB shell version: 3.2.6connecting to: foobarSuccessfully added user: {        "user" : "***********",        "roles" : [                {                        "role" : "readWrite",                        "db" : "foobar"                }        ]} ---> e73b6c8c8b83Removing intermediate container 58ba44d02508Successfully built e73b6c8c8b83

jadi pengguna dibuat, tapi kemudian ketika saya mencoba untuk menghubungkan, saya mendapatkan:

mongo_1  | 2016-05-13T17:44:02.159+0000 I NETWORK  [initandlisten] connection accepted from 172.20.0.4:41294 #1 (1 connection now open)mongo_1  | 2016-05-13T17:44:02.160+0000 I ACCESS   [conn1] SCRAM-SHA-1 authentication failed for ********* on foobar from client 172.20.0.4 ; UserNotFound: Could not find user *********@foobarmongo_1  | 2016-05-13T17:44:02.160+0000 I NETWORK  [conn1] end connection 172.20.0.4:41294 (0 connections now open)

Mengapa itu terjadi? Bagaimana Saya bisa mempertahankan pengguna yang dibuat?

Solusi saya:

Di dalam Anda Dockerfile:

ADD create_ddbb.js /tmp/RUN mongod -f /etc/mongod.conf --fork --logpath /var/log/mongodb.log \    && sleep 5 \    && mongo <YOUR DATABASE> /tmp/create_ddbb.js

Di dalam create_ddbb.js:

db.createUser(    {      user: "your_user",      pwd: "********************",      roles: [         { role: "dbOwner", db: "your_database" }      ]    },    {        w: "majority",        wtimeout: 5000    });db.createCollection("test");

The createColleciton("test") pada akhirnya sangat penting. Tanpa itu, the createUser tidak diterapkan. Saya tidak tahu persis mengapa, maaf.

pengguna harus ditambahkan dalam database admin jadi seperti ini:RUN mongod --fork --logpath /var/log/mongodb.log \ && sleep 5 && mongo foobar /tmp/create_ddbb.js

Saya tidak menggunakan Dockerfile. Sebagai gantinya saya menggunakan docker-compose.yml untuk menentukan wadah.Di bawah ini adalah konten docker-compose.yml

version: "3.7"services:  mongo:    container_name: container-mongodb    image: mongo:latest    restart: always    ports:      - 27017:27017    environment:      MONGO_INITDB_ROOT_USERNAME: root      MONGO_INITDB_ROOT_PASSWORD: password      MONGO_INITDB_DATABASE: root-db    volumes:      - ./docker-entrypoint-initdb.d/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro 

Buat direktori docker-entrypoint-initdb.d dan menciptakan mongo-init.js file. dan menempatkan kode di bawah ini untuk menambahkan pengguna.

print("Started adding the users.");db = db.getSiblingDB("admin");db.createUser({  user: "userx",  pwd: "1234",  roles: [{ role: "readWrite", db: "admin" }],});print("End adding the user roles.");

Kemudian jalankan docker compose dari direktori tempat Anda menyimpan docker compose.yml.Pohon file akan terlihat seperti:

project-directory ┣ docker-entrypoint-initdb.d ┃ ┗ mongo-init.js ┗ docker-compose.yaml

Periksa log jika Anda menemukan kesalahan.

Saya tidak dapat menjalankan solusi @alexandernst. Dalam kombinasi dengan https://github.com/docker-library/mongo/issues/329 Saya hanya harus membuat Dockerfile saya jadi dan itu wored.

FROM docker.io/mongo:latestCOPY create_ddbb.js /docker-entrypoint-initdb.d/

Create_ddbb.js mirip dengan @ alexandernst, tetapi tanpa baris terakhir yang membuat koleksi pengujian.