Docker-compose:我可以自动编写组件来运行容器内的命令吗?

时间:2016-05-22 11:12:19

标签: mongodb docker docker-compose

好的,所以我知道我可以像这样自动执行“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中自动执行此操作?

2 个答案:

答案 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对等体并将它们添加到副本集。