How to create user in mongodb with docker-compose

后端 未结 8 1193
天命终不由人
天命终不由人 2020-12-23 20:28

I\'m trying to create some kind of script that will create a docker with mongodb and automatically create a user.

I can usually manage my docker images with docker-c

8条回答
  •  孤城傲影
    2020-12-23 21:01

    For initializing mongo with initial user-password-db triple and initdb scripts with only one docker-compose.yml, without any extra configuration, you can use bitnami/mongo image.

    In my case, I didn't run my scripts under /docker-entrypoint-initdb.d directory in the container after setting environment variables; MONGODB_USERNAME and MONGODB_PASSWORD (specific env variables for bitnami image) because mongod runs with --auth option automatically when you set these variables. Consequently, I got authentication errors when the container was in the process of executing the scripts.

    Because, it was connecting to: mongodb://192.168.192.2:27017/compressors=disabled&gssapiServiceName=mongodb

    TERMINAL LOG OF THE ERROR

    FIRST DOCKER-COMPOSE FILE:

    version: "3"
    services:
    mongodb:
        container_name: mongodb
        image: 'docker.io/bitnami/mongodb:4.2-debian-10'
        ports:
            - "27017:27017"
        volumes:
            - "mongodb_data:/bitnami/mongodb"
            - "./mongodb/scripts:/docker-entrypoint-initdb.d"
        environment:
            - MONGODB_INITSCRIPTS_DIR=/docker-entrypoint-initdb.d
            - MONGODB_USERNAME=some_username
            - MONGODB_PASSWORD=some_password
            - MONGODB_DATABASE=some_db_name
        networks:
            backend:
        restart: unless-stopped
    volumes:
        mongodb_data:
    networks:
        backend:
            driver: bridge
    

    INIT JS FILE UNDER ./mongodb/scripts PATH:

    let db = connect("localhost:27017/some_db_name");
    db.auth("some_username", "some_password");
    let collections = db.getCollectionNames();
    let storeFound = false; 
    let index;
    for(index=0; index

    So, I decided to add new environment variables to my docker-compose.yml after inspecting https://github.com/bitnami/bitnami-docker-mongodb/blob/master/4.2/debian-10/rootfs/opt/bitnami/scripts/libmongodb.sh file.

    In this sh file, there is function like mongodb_custom_init_scripts() for executing the scripts. For executing all script files, it runs mongodb_execute() method. In this method, after mongod instance is up and run, mongo client is connecting to the mongod instance by using some parameters.

    ########################
    # Execute an arbitrary query/queries against the running MongoDB service
    # Stdin:
    #   Query/queries to execute
    # Arguments:
    #   $1 - User to run queries
    #   $2 - Password
    #   $3 - Database where to run the queries
    #   $4 - Host (default to result of get_mongo_hostname function)
    #   $5 - Port (default $MONGODB_PORT_NUMBER)
    #   $6 - Extra arguments (default $MONGODB_CLIENT_EXTRA_FLAGS)
    # Returns:
    #   None
    ########################
    mongodb_execute() {
        local -r user="${1:-}"
        local -r password="${2:-}"
        local -r database="${3:-}"
        local -r host="${4:-$(get_mongo_hostname)}"
        local -r port="${5:-$MONGODB_PORT_NUMBER}"
        local -r extra_args="${6:-$MONGODB_CLIENT_EXTRA_FLAGS}"
        local result
        local final_user="$user"
        # If password is empty it means no auth, do not specify user
        [[ -z "$password" ]] && final_user=""
    
        local -a args=("--host" "$host" "--port" "$port")
        [[ -n "$final_user" ]] && args+=("-u" "$final_user")
        [[ -n "$password" ]] && args+=("-p" "$password")
        [[ -n "$extra_args" ]] && args+=($extra_args)
        [[ -n "$database" ]] && args+=("$database")
    
        "$MONGODB_BIN_DIR/mongo" "${args[@]}"
    }
    

    After that I added new environment variables to my docker-compose like MONGODB_ADVERTISED_HOSTNAME, MONGODB_PORT_NUMBER, and, MONGODB_CLIENT_EXTRA_FLAGS

    So my final docker-compose.yml looks like:

    version: "3"
    services:
    mongodb:
        container_name: mongodb
        image: 'docker.io/bitnami/mongodb:4.2-debian-10'
        ports:
            - "27017:27017"
        volumes:
            - "mongodb_data:/bitnami/mongodb"
            - "./mongodb/scripts:/docker-entrypoint-initdb.d"
        environment:
            - MONGODB_INITSCRIPTS_DIR=/docker-entrypoint-initdb.d
            - MONGODB_USERNAME=some_username
            - MONGODB_PASSWORD=some_password
            - MONGODB_DATABASE=some_db_name
            - MONGODB_ADVERTISED_HOSTNAME=localhost
            - MONGODB_PORT_NUMBER=27017
            - MONGODB_CLIENT_EXTRA_FLAGS=--authenticationDatabase=some_db_name
        networks:
            backend:
        restart: unless-stopped
    volumes:
        mongodb_data:
    networks:
        backend:
            driver: bridge
    

    Now, it was connecting by this url:

    mongodb://localhost:27017/?authSource=some_db_name&compressors=disabled &gssapiServiceName=mongodb

提交回复
热议问题