Создайте нового пользователя для MongoDB внутри Docker

Я использую образ MongoDB Docker по умолчанию и пытаюсь создать нового пользователя для базы данных.

В настоящее время я пытаюсь сделать это таким образом:

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 

И create_ddbb.js:

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

И когда я создаю Dockerfile, я вижу:

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

итак, пользователь создан, но затем, когда я пытаюсь подключиться, я получаю:

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)

Почему это происходит? Как я могу сохранить созданного пользователя?

Мое решение:

Внутри твоего 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

Внутри create_ddbb.js:

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

То createColleciton("test") в конце концов, это чрезвычайно важно. Без этого, то createUser не применяется. Я точно не знаю, почему, извини.

пользователь должен быть добавлен в базу данных администратора примерно так:RUN mongod --fork --logpath /var/log/mongodb.log \ && sleep 5 && mongo foobar /tmp/create_ddbb.js

Я не использовал Dockerfile. Вместо этого я использовал docker-compose.yml для указания контейнера.Ниже приведено содержимое 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 

Создайте каталог docker-entrypoint-initdb.d и создать mongo-init.js файл. и введите приведенный ниже код, чтобы добавить пользователя.

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.");

Затем запустите docker compose up из каталога, в котором вы сохранили файл docker compose.yml.Дерево файлов должно выглядеть следующим образом:

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

Проверьте журналы, если вы столкнетесь с какими-либо ошибками.

Я не смог запустить решение @alexandernst. В сочетании с https://github.com/docker-library/mongo/issues/329 Мне просто нужно было создать свой файл Dockerfile, и он заработал.

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

В create_ddbb.js был похож на @alexandernst, но без последней строки, которая создавала тестовую коллекцию.