如何使用docker-compose在mongodb中创建用户

时间:2016-05-24 20:52:09

标签: mongodb docker docker-compose

我正在尝试创建某种脚本,用mongodb创建一个docker并自动创建一个用户。

我通常可以使用docker-compose管理我的docker图像,但这一次,我不知道该怎么做。

基本上,这是我必须做的事情:

  1. 清理/销毁容器(docker-compose down
  2. 使用mongodb创建一个docker容器并启动它(不带--auth parameter
  3. 执行包含db.createUser()
  4. 的java脚本
  5. 停止容器
  6. 使用--auth参数重新启动相同的容器,以允许使用在javascript
  7. 中创建的用户进行登录

    我找不到如何用docker-compose正确地做到这一点,因为当它开始时,我必须给它命令--auth。如果我这样做,我就无法执行我的javascript来添加我的用户。如果没有用户且未提供--auth参数,MongoDB允许用户创建而无需登录。

    我想自动执行此操作,我不想手动执行某些命令。目标是在每次集成测试之前创建一个脚本,以便从干净的数据库开始。

    这是我的项目:

    集成测试/ SRC /测试/资源/脚本/搬运工-compose.yml

    mongodb:
        container_name: mongo
        image: mongo
      ports:
        - "27017:27017"
      volumes:
        - .:/setup
      command: --auth
    

    集成测试/ SRC /测试/资源/脚本/ docker-init.sh

    docker-compose down
    docker-compose up -d
    sleep 1
    docker exec mongo bash -c "mongo myDatabase /setup/mongodb-setup.js"
    

    集成测试/ SRC /测试/资源/脚本/ mongodb的-setup.js

    db.createUser(
    {
        user: "myUser",
        pwd: "myPassword",
        roles: [
          { role: "readWrite", db: "myDatabase" }
        ]
    })
    

    找到一种方法来重新启动带有新参数的容器(在本例中为--auth)会有所帮助,但我找不到如何做到这一点(docker start不接受参数)。

    知道我应该怎样做我想做的事吗?

    如果没有,我仍然可以使用一些Java代码或其他东西删除我的数据库中的所有内容,但我希望使用脚本创建一个完整的mongodb docker设置。

8 个答案:

答案 0 :(得分:22)

官方mongo图像现在支持以下环境变量,可以在docker-compose中使用,如下所示:

environment:
      - MONGO_INITDB_ROOT_USERNAME=user
      - MONGO_INITDB_ROOT_PASSWORD=password
      - MONGO_INITDB_DATABASE=test

更多解释: https://stackoverflow.com/a/42917632/1069610

答案 1 :(得分:13)

编辑: tutumcloud存储库已弃用且不再维护,请参阅其他答案

我建议您使用环境变量来设置mongo用户,数据库和密码。 tutum(由Docker拥有)发布了一个非常好的图像

https://github.com/tutumcloud/mongodb

docker run -d -p 27017:27017 -p 28017:28017 -e MONGODB_USER="user" -e MONGODB_DATABASE="mydatabase" -e MONGODB_PASS="mypass" tutum/mongodb

您可以将这些变量转换为docker-compose环境变量。你不必硬编码。

environment:
    MONGODB_USER: "${db_user_env}"
    MONGODB_DATABASE: "${dbname_env}"
    MONGODB_PASS: "${db_pass}"

此配置将从会话的环境变量中读取。

答案 2 :(得分:13)

我就是这样做的,我的要求是带上一些容器和mongodb,其他容器希望用户在他们出现时在场,这对我有用。好的部分是,mongoClientTemp在命令执行后退出,因此容器不会停留。

version: '2'
services:
  mongo:
   image: mongo:latest
   container_name: mongo
   ports:
    - "27017:27017"
   volumes:
    - /app/hdp/mongo/data:/data/db

  mongoClientTemp:
   image: mongo:latest
   container_name: mongoClientTemp
   links:
    - mongo:mongo
   command: mongo --host mongo --eval  "db.getSiblingDB('dashboard').createUser({user:'db', pwd:'dbpass', roles:[{role:'readWrite',db:'dashboard'}]});"
   depends_on:
    - mongo

  another-container:
   image: another-image:v01
   container_name: another-container
   ports:
    - "8080:8080"
   volumes:
    - ./logs:/app/logs
   environment:
    - MONGODB_HOST=mongo
    - MONGODB_PORT=27017
   links:
    - mongo:mongo
   depends_on:
    - mongoClientTemp

答案 3 :(得分:1)

在阅读官方mongo docker page后,我发现您可以一次创建管理员用户,即使正在使用auth选项也是如此。这没有很好的记录,但它只是工作(希望它不是一个功能)。 因此,您可以一直使用auth选项。

我创建了一个github存储库,其中包含了要使用的命令的脚本。要运行的最重要的命令行是:

docker exec db_mongodb mongo admin /setup/create-admin.js
docker exec db_mongodb mongo admin /setup/create-user.js -u admin -p admin --authenticationDatabase admin

第一行将创建admin用户(即使使用auth选项,mongo也不会抱怨)。第二行将创建你的正常"用户,使用第一个管理员权限。

答案 4 :(得分:1)

文件:docker-compose.yaml

mongo:
    image: mongo:latest
    volumes_from:
        - data
    ports:
        - "27017:27017"
    command: --auth

    container_name: "db_mongodb"

data:
    image: mongo:latest
    volumes:
        - /var/lib/mongo
        - ./setup:/setup
    command: "true"
    container_name: "db_mongodb_data"

文件:.buildMongo.sh

#!/bin/sh
docker-compose down
docker-compose up -d
sleep 1
docker exec db_mongodb  mongo admin /setup/create-admin.js
docker exec db_mongodb  mongo myDb /setup/create-user.js -u admin -p admin --authenticationDatabase admin

create-admin.js和create-user.js文件是您使用mongo shell使用的命令。因此,它们必须易于理解。真正的方向就像jzqa的答案“环境变量”。 因此,这里的问题是如何创建用户。我认为这至少回答了这一点,您可以在https://github.com/Lus1t4nUm/mongo_docker_bootstrap

处检查完整的设置

答案 5 :(得分:0)

Mongo映像提供了/docker-entrypoint-initdb.d/路径,用于部署自定义.js或.sh安装脚本。

查看此帖子以获取更多详细信息: How to create a DB for MongoDB container on start up?

答案 6 :(得分:0)

要使用仅具有一个docker-compose.yml的初始user-password-db Triple和initdb脚本初始化mongo,而无需进行任何额外配置,则可以使用bitnami / mongo映像。

就我而言,设置环境变量后,我没有在容器的 /docker-entrypoint-initdb.d 目录下运行脚本; MONGODB_USERNAME MONGODB_PASSWORD (bitnami图像的特定环境变量),因为 mongod 与设置这些变量时,会自动-auth 选项。因此,当容器正在执行脚本的过程中,我收到了身份验证错误。

因为它正在连接到: mongodb://192.168.192.2:27017 / compressors = disabled&gssapiServiceName = mongodb

TERMINAL LOG OF THE ERROR

第一个DOCKER组成文件:

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

./ mongodb / scripts路径下的INIT JS文件:

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<collections.length; index++){
   if ("store" === collections[index]){
       storeFound = true;   
   }
}
if(!storeFound ){
   db.createCollection("store");
   db.store.createIndex({"name": 1});
}

因此,在检查https://github.com/bitnami/bitnami-docker-mongodb/blob/master/4.2/debian-10/rootfs/opt/bitnami/scripts/libmongodb.sh文件之后,我决定将新的环境变量添加到docker-compose.yml中。

在此sh文件中,具有执行脚本的功能,如 mongodb_custom_init_scripts()。为了执行所有脚本文件,它运行 mongodb_execute()方法。在此方法中,mongod实例启动并运行后,mongo客户端通过使用一些参数连接到mongod实例。

########################
# 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[@]}"
}

此后,我在docker-compose中添加了新的环境变量,例如 MONGODB_ADVERTISED_HOSTNAME MONGODB_PORT_NUMBER ,然后, MONGODB_CLIENT_EXTRA_FLAGS

所以我最终的docker-compose.yml看起来像:

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

现在,它正在通过以下网址进行连接:

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

答案 7 :(得分:-2)

将--noauth选项添加到mongo命令

从我的docker-compose.yml文件中提取

mongors:
  image: mongo:latest
  command: mongod --noprealloc --smallfiles --replSet mongors2 --dbpath /data/db --nojournal --oplogSize 16 --noauth
  environment:
    TERM: xterm
  volumes:
    - ./data/mongors:/data/db