我正在尝试创建某种脚本,用mongodb创建一个docker并自动创建一个用户。
我通常可以使用docker-compose管理我的docker图像,但这一次,我不知道该怎么做。
基本上,这是我必须做的事情:
docker-compose down
)--auth parameter
)db.createUser()
--auth
参数重新启动相同的容器,以允许使用在javascript 我找不到如何用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设置。
答案 0 :(得分:22)
官方mongo图像现在支持以下环境变量,可以在docker-compose中使用,如下所示:
environment:
- MONGO_INITDB_ROOT_USERNAME=user
- MONGO_INITDB_ROOT_PASSWORD=password
- MONGO_INITDB_DATABASE=test
答案 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
第一个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