如何用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