Crear un nuevo usuario para MongoDB dentro de Docker

Estoy usando la imagen predeterminada de MongoDB Docker y estoy tratando de crear un nuevo usuario para la base de datos.

Actualmente estoy tratando de hacerlo de esta manera:

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 

Y el create_ddbb.js:

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

Y cuando construyo el Dockerfile, veo:

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

entonces se crea el usuario, pero luego, cuando intento conectarme, obtengo:

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 qué está pasando eso? ¿Cómo puedo conservar el usuario creado?

Mi solución:

Dentro de tu 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 de la create_ddbb.js:

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

El createColleciton("test") al final es extremadamente importante. Sin eso, el createUser no se aplica. No se exactamente por qué, lo siento.

el usuario debe agregarse en la base de datos de administración, de esta manera:RUN mongod --fork --logpath /var/log/mongodb.log \ && sleep 5 && mongo foobar /tmp/create_ddbb.js

No utilicé el Dockerfile. En su lugar, utilicé docker-compose.yml para especificar el contenedor.A continuación se muestra el contenido de 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 

Crear un directorio docker-entrypoint-initdb.d y crear mongo-init.js file. y pon el siguiente código para agregar usuario.

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

A continuación, ejecute docker compose desde el directorio en el que ha guardado docker compose.yml.El árbol de archivos debería verse así:

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

Compruebe los registros si encuentra algún error.

No pude ejecutar la solución de @alexandernst. En combinación con https://github.com/docker-library/mongo/issues/329 Solo tuve que crear mi Dockerfile so y funcionó.

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

El create_ddbb.js era similar al de @alexandernst, pero sin la última línea que creaba una colección de prueba.