好的,所以我知道我可以像这样自动执行“docker run”指令,比如说我会这样做而不用编写:
首先创建音量
docker volume create --name mongodb-shard-1-node-1
然后是容器
docker run --name mongodb-node-1 -d -v mongodb-node-1:/data/db -p 27031:27017 --link mongo-node-2:mongo mongo --replSet rs0 --smallfiles --oplogSize 128
这与在docker-compose.yml
文件中包含此内容相同:
mongodb-node-1:
image: mongo
volumes:
- "mongodb-node-1:/data/db"
ports:
- "27031:27017"
container_name: mongodb-node-1
external_links:
- "mongodb-node-3:mongo"
command: --replSet rs0 --smallfiles --oplogSize 128
但我还必须在mongodb shell中运行命令,为此我首先使用exec
进入shell,如下所示:
docker exec -it mongodb-shard-1-node-1 mongo
之后在shell中我需要运行诸如
之类的命令rs.initiate()
和其他人一样
rs.addArb("172.17.0.6:27017")
等...
我可以使用docker-compose自动执行这些最后一步吗?是否可以在docker中自动执行此操作?
答案 0 :(得分:0)
遗憾的是,你无法直接自动化它。
作为一种解决方法,您可以扩展容器以添加运行的shell脚本,启动Mongo,然后运行指定的命令。如果需要修改,你甚至可以在环境变量中传入该IP地址。
答案 1 :(得分:0)
Kontena利用了docker-compose.yml文件格式,并通过添加Math.acos(0.14..)
hook来引入此类功能。
post_start
https://github.com/kontena/examples/blob/master/mongodb-cluster/kontena.yml
peer:
image: mongo:3.2
stateful: true
command: --replSet kontena --smallfiles
instances: 3
hooks:
post_start:
- cmd: sleep 10
name: sleep
instances: 1
oneshot: true
- cmd: mongo --eval "printjson(rs.initiate());"
name: rs_initiate
instances: 1
oneshot: true
- cmd: mongo --eval "printjson(rs.add('%{project}-peer-2'))"
name: rs_add2
instances: 1
oneshot: true
- cmd: mongo --eval "printjson(rs.add('%{project}-peer-3'))"
name: rs_add3
instances: 1
oneshot: true
命令将部署所有三个mongodb对等体并将它们添加到副本集。