如何编辑自动在docker容器中运行命令的蓝图cloudify
我想以cloudify方式运行RYU控制器的docker容器。我写了一个蓝图文件,我可以用它创建相关的部署,并最终启动Docker容器。如何编辑自动在docker容器中运行命令的蓝图cloudify
问题是,控制器(在码头集装箱内)需要实现一个脚本来运行,但我不知道如何修改蓝图文件以自动运行脚本。每次,我必须输入docker exec CONTAINER ryu-manager /path/simple_switch.py
为目标。
因此,有谁知道命令应该放在蓝图的哪个位置。我试图将它包含在内
interfaces:
cloudify.interfaces.lifecycle:
create:
implementation: docker.docker_plugin.tasks.create_container
inputs:
params:
ports:
- { get_input: docker_port }
stdin_open: true
tty: true
command: /bin/bash
start:
implementation: docker.docker_plugin.tasks.start
inputs:
params:
port_bindings: { get_input: container_port_binding }
command: docker exec ryu ryu-manager /ryu/ryu/app/simple_switch.py
# here ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
但收到意外参数的错误。
感谢您的时间和任何意见,将不胜感激〜
还是让我把这种方式,如果有人知道,这部分在cloudify蓝图匹配docker exec
?
我使用Cloudify很多,我使用Docker很多。 Docker插件有点“很高兴”,但它确实没有必要。您可以从Cloudify脚本插件的内部运行诸如“docker exec”和“docker run”之类的命令,并获得相同的结果,并且不需要弄清楚使用Docker的不同接口。
例如,如果我有此cloudify蓝图(简化):
yaml node_templates: my_app: type: cloudify.nodes.SoftwareComponent interfaces: cloudify.interfaces.lifecycle: create: implementation: scripts/create.sh start: implementation: scripts/start.sh relationships: - type: cloudify.relationships.depends_on target: vm
我可以调用这些脚本:
脚本/ create.sh:
docker run -d ryu
脚本/启动。sh
docker exec -it ryu ryu-manager /ryu/ryu/app/simple_switch.py
在我回答之前,我没有使用cloudify的经验,但我已经看过文档,看看它是什么。这里是我的指针给你。
首先我看着泊坞窗插件在低于URL
https://github.com/cloudify-cosmo/cloudify-docker-plugin/blob/master/docker_plugin/tasks.py
而且它不具有任何执行语句本身。因此,您应该从创建和启动生命周期中删除command
。这样做会确保默认图像命令运行。
现在你的任务是在容器内执行一个额外的命令。由于docker插件不支持该操作,所以最好的办法是获取新创建的容器的容器ID。这应该是可能的使用一些输出参数捕获
现在,您要在本地计算机或安装docker的远程计算机上执行命令。这可以设置为另一个生命周期,它从创建的容器获取ID并在该主要泊坞站主机上执行docker exec <ID> ryu-manager /ryu/ryu/app/simple_switch.py
命令。
谢谢塔伦你在答案中的特别努力!我推荐[这个docker插件](https://github.com/docker/docker-py/blob/master/docker/api/container.py),它由更多的(当然不包括'start'中的'command' )。 – Lootii
我试图添加一个'运行'生命周期。由于[docker插件](http://docs.getcloudify.org/4.0.0/plugins/docker/#create)似乎只支持'create','start','stop'和'remove_container',我认为没有新的变化是合理的。 – Lootii
哇!这听起来很酷且很简单!我认为使用官方插件是必须的。非常感谢!我会试一试。 – Lootii
它工作正常,你想出了!但是这些旗帜可能是不可能的。容器无法通过'run -d'继续运行,'-t'导致'输入设备不是tty'错误。无论如何,解决方案真的有很大的帮助。再次感谢! – Lootii
嗨,@earthmant!我能再问一个问题吗?由于docker容器是由脚本运行的,我说对了,容器状态只是脚本的结果吗?也就是说,容器实际上与任何cloudify节点无关。 (我发现自己不能通过其他方式影响容器......) – Lootii