如何用docker-compose在mongodb中创build用户

晚上好,

我正在尝试创build一些脚本,用mongodb创build一个docker并自动创build一个用户。

我通常可以用docker-compose来pipe理我的docker镜像,但这次我不知道该怎么做。

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

1)清洁/销毁容器(docker – 组成)

2)用mongodb创build一个docker容器并启动它(没有–auth参数)

3)执行一个包含db.createUser()的java脚本

4)停止容器

5)使用–auth参数重新启动相同的容器,以允许用javascript中创build的用户login

我无法find如何正确使用docker-compose,因为当它启动时,我必须给它命令–auth。 如果我这样做,我不能执行我的JavaScript来添加我的用户。 如果没有用户,并且没有提供–auth参数,MongoDB允许用户在不login的情况下创build。

我想这样做自动,我不想手动做一些命令。 目标是在每次集成testing之前都有一个可以在干净的数据库中启动的脚本。

这是我的项目:

集成testing/ src目录/testing/资源/脚本/泊坞窗,compose.yml

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

集成testing/ src目录/testing/资源/脚本/ docker-init.sh

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

集成testing/ src目录/testing/资源/脚本/ MongoDB的-setup.js

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

find一个方法来重新启动一个新的参数容器(在这种情况下 – – auth)将有所帮助,但我无法find如何做(docker start不带参数)。

任何想法我应该怎么做我想要的?

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

谢谢!

编辑:存储库已被弃用,不再维护

我build议你使用环境variables来设置mongo用户,数据库和密码。 (由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 

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

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

该configuration将从您的会话的环境variables中读取。

这就是我的做法,我的要求是随着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 

官方的mongo镜像现在支持可以在docker-compose中使用的以下环境variables:

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

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

在阅读官方的mongo docker页面后 ,我发现你可以一次创build一个admin用户,即使正在使用auth选项。 这没有很好的logging,但它只是工作(希望它不是一个function)。 因此,您可以一直使用auth选项。

我创build了一个包含要使用的命令的脚本的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 

第一行将创buildpipe理员用户(即使auth选项,mongo也不会抱怨)。 第二行将使用第一行的pipe理员权限创build“普通”用户。

将–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