Create a new user for MongoDB inside Docker

16,727

Solution 1

My solution:

Inside your 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

Inside the 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") at the end is extremely important. Without that, the createUser isn't applied. I don't know why exactly, sorry.

Solution 2

the user should be added in the admin database so like this: RUN mongod --fork --logpath /var/log/mongodb.log \ && sleep 5 && mongo foobar /tmp/create_ddbb.js

Share:
16,727

Related videos on Youtube

alexandernst
Author by

alexandernst

Updated on September 18, 2022

Comments

  • alexandernst
    alexandernst almost 2 years

    I'm using the default MongoDB Docker image and I'm trying to create a new user for the database.

    I'm currently trying to do it this way:

    FROM docker.io/mongo:3.2
    
    MAINTAINER <alexandernst> [email protected]
    
    ADD create_ddbb.js /tmp/
    
    RUN mongod --fork --logpath /var/log/mongodb.log \
        && sleep 5 && mongo foobar /tmp/create_ddbb.js 
    

    And the create_ddbb.js:

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

    And when I build the Dockerfile, I see:

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

    so the user is created, but then when I try to connect, I get:

    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 *********@foobar
    mongo_1  | 2016-05-13T17:44:02.160+0000 I NETWORK  [conn1] end connection 172.20.0.4:41294 (0 connections now open)
    

    Why is that happening? How can I persist the created user?

  • alexandernst
    alexandernst about 8 years
    Do you mean mongo admin /tmp/create_ddbb.js? If so, I tried that and it's still not working (same output).
  • FooBee
    FooBee almost 8 years
    We have redacted the first edit. You should change your password anyway.
  • Ascalonian
    Ascalonian almost 8 years
    What's in the mongo.conf file?
  • Ascalonian
    Ascalonian almost 8 years
    @alexandernst - Thanks! I am just using mongo:latest so I wasn't sure.