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

Docker-compose: Can I automate compose to run commands inside a container?

好的,所以我知道我可以像这样自动化我的 "docker run" 指令,假设我会在没有 compose 的情况下执行此操作:

首先创建卷

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 中自动执行此操作?

遗憾的是,你不能像那样直接自动化它。

作为解决方法,您可以扩展容器以添加一个 shell 脚本,该脚本运行、启动 Mongo,然后运行指定的命令。如果需要修改,您甚至可以在环境变量中传入该 IP 地址。

Kontena 利用了 docker-compose.yml 文件格式并通过添加 post_start 钩子引入了这种功能。

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 https://github.com/kontena/examples/blob/master/mongodb-cluster/kontena.yml

$ kontena app deploy 命令将部署所有三个 mongodb 节点并将它们添加到副本集。