Crie um novo usuário para MongoDB dentro do Docker

Estou usando a imagem padrão do MongoDB Docker e estou tentando criar um novo usuário para o banco de dados.

No momento, estou tentando fazer isso dessa maneira:

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 

E o create_ddbb.js:

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

E quando eu construo o Dockerfile, vejo:

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

então o Usuário é criado, mas quando tento me conectar, recebo:

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)

Por que isso está acontecendo? Como posso persistir o usuário criado?

Minha solução:

Dentro do seu 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

Dentro do create_ddbb.js:

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

O createColleciton("test") no final é extremamente importante. Sem isso, o createUser não é aplicado. Não sei por que exatamente, desculpe.

o Usuário deve ser adicionado no banco de dados admin assim como este:RUN mongod --fork --logpath /var/log/mongodb.log \ && sleep 5 && mongo foobar /tmp/create_ddbb.js

Eu não usei o Dockerfile. Em vez disso, usei docker-compose.yml para especificar o contêiner.Abaixo está o conteúdo do 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 

Criar um diretório docker-entrypoint-initdb.d e criar mongo-init.js arquivo. e coloque o código abaixo para adicionar o usuário.

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

Em seguida, execute o docker compose a partir do diretório onde você manteve o docker compose.yml.A árvore de arquivos deve ser semelhante:

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

Verifique os logs se você encontrar algum erro.

Não consegui fazer a solução de @alexandernst funcionar. Em combinação com https://github.com/docker-library/mongo/issues/329 Eu só tive que criar meu Dockerfile so e ele se preocupou.

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

O create_ddbb.js era semelhante ao @alexandernst's, mas sem a última linha que criou uma coleção de testes.