我有一个在Compose中创建的Mongo容器:
version: '2'
volumes:
mongodata:
driver: local
services:
mongo:
image: mongo:latest
hostname: ${MONGODB_HOST}
restart: always
ports:
- "27017:27017"
volumes:
- mongodata:/data/db
这个方法很完美,但现在我想在数据库上设置密码。为此,首先我需要创建数据库,添加密码,然后使用--auth
标志重新启动它。我的问题是如何使用docker-compose完成此过程。
如果我不使用docker-compose,我可以做到这一点。我能看到使用compose可能会遇到的问题有:
a) docker-compose工作在docker网络中。
b) 在开始时,docker-compose不能运行不同的命令,与生产环境不同。这很重要,因为尽管有些人说你可以在开始时运行--auth
,并且它会允许您第一次设置密码,但事实并非如此。
我开始着手解决的一个解决方案是,在运行docker-compose文件之前,我将在所有服务器上运行一个shell脚本:
# start the temporary container
docker run -d -v /tmp/mongodb --name tmpdb -e MONGODB_DBNAME=db_test mongo --auth
# do the user creation
docker run -it --link tmpdb --rm mongo sh -c 'mongo --host tmpdb --eval "db.createUser({ user: \"admin\", pwd: \"password\", roles: [ { role: \"root\", db: \"admin\" } ] });"'
# stop the server
docker stop tmpdb
# create new mongodb container, using the old ones data
docker run -d -p 27017:27017 --name mongo2 -e MONGODB_DBNAME=db_test mongo --auth
# clean up old container (we are using the volumes so they will stick around)
docker rm tmpdb
该文件创建一个临时容器,在其上设置用户名/密码,停止原始容器,使用旧容器的卷容器创建新容器,然后删除原始容器。 新的mongo容器现在已经设置了密码。
那么我的最终问题是,在docker-compose中做这件事的最佳方法是什么?
我docker-compose文件中的其他容器需要能够访问mongo,因此我认为保持mongo数据的卷容器需要在docker-compose创建的相同网络中。
environment:
部分并添加command: mongod --auth
。 - alecdwmauthorization: true
的 mongodb.conf 挂载卷。 - Suroor Ahmmad