mongodb - 如何在 docker-compose 之后运行 Mongo shell 命令?
问题描述
我想启动这个 MongoDB 副本集:
version: "3"
services:
mongo1:
image: mongo
ports:
- 27017:27017
command: mongod --replSet rs0
mongo2:
image: mongo
ports:
- 27018:27017
command: mongod --replSet rs0
mongo3:
image: mongo
ports:
- 27019:27017
command: mongod --replSet rs0
等待那些出现,然后通过终端访问 Mongo shell:
docker exec -it mongo1 mongo
然后在 Mongo shell 中执行以下操作:
rs.initiate({"_id":"rs0","members":[{"_id":0,"host":"mongo1:27017"},{"_id":1,"host":"mongo2:27017"},{"_id":2,"host":"mongo3:27017"}]})
Mongo 还允许mongo --eval "rs.initiate(..)"
,这可能会使事情变得更容易。
我的问题是如何在 mongo1、mongo2、mongo3 启动后运行此命令?
解决方案
你可以这样做,我最近必须运行mongo --repair
然后运行 MongoDB 本身,在 MongoDB 启动后,我需要将我的用户添加到数据库,只有在所有三个 MongoDB 都启动后,你才能轻松更改运行命令。
可能的 docker-compose.yml:
version: "2"
services:
mongo:
container_name: mongo
restart: on-failure:10
image: mongo
environment:
- MONGO_INITDB_ROOT_USERNAME=<user>
- MONGO_INITDB_ROOT_PASSWORD=<pass>
- MONGO_INITDB_DATABASE=db
volumes:
- ./data:/data/db
ports:
- "27017:27017"
command: bash -c "mongod --repair && mongod"
mongoClient:
image: mongo
container_name: mongoClient
links:
- mongo
volumes:
- ./deployment_scripts:/deployment_scripts
command:
- /deployment_scripts/add_user.sh
depends_on:
- mongo
app:
container_name: app
restart: always
build: .
volumes:
- .:/usr/src/app
ports:
- "3000:3000"
depends_on:
- mongoClient
links:
- mongo
我的/deployment_scripts/add_user.sh
脚本等待 MongoDB 启动:
until mongo --host mongo --eval "print(\"waited for connection\")"
do
sleep 1
done
// you can add more MongoDB waits here
echo "Adding user to MongoDB..."
mongo --host mongo --eval "db.createUser({ user: \"<user>\", pwd: \"<pass>\", roles: [ { role: \"root\", db: \"admin\" } ] });"
echo "User added."
请注意,您可以通过替换--host mongo
为您的--host mongo1
--host mongo2
和来处理所有三个 MongoDB --host mongo3
。您将在脚本中的两个 eval 命令中使用它。
归功于我使用的这个 SO 答案https://stackoverflow.com/a/45060399/4295037until mongo ...
( )。
推荐阅读
- javascript - 根据 Angular 11 中的另一个下拉菜单更改下拉菜单?
- flutter - 'Flutter run --verbose' 和 Visual Studio Icon 之间的区别?(当我运行我的应用程序时)
- python - Python在两个整数的两个元组之间交换元素
- java - 空白是Java中的标记吗?
- c - 如何在函数中使用`malloc/calloc`?
- javascript - Angular target.getAttribute() 检查空条件
- fuzzing - 使用 winafl dynamorio 通知 Application C:\my\program\path\program.exe 客户端库以不兼容的 API 版本为目标,应重新编译
- github-actions - 按作业状态过滤 GitHub Actions 工作流运行
- django - Django Paypal 集成 createOrder curl
- windows - WIC 是否支持 AVIF 文件?