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 节点并将它们添加到副本集。
好的,所以我知道我可以像这样自动化我的 "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 节点并将它们添加到副本集。