如何编辑自动在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

+0

哇!这听起来很酷且很简单!我认为使用官方插件是必须的。非常感谢!我会试一试。 – Lootii

+0

它工作正常,你想出了!但是这些旗帜可能是不可能的。容器无法通过'run -d'继续运行,'-t'导致'输入设备不是tty'错误。无论如何,解决方案真的有很大的帮助。再次感谢! – Lootii

+0

嗨,@earthmant!我能再问一个问题吗?由于docker容器是由脚本运行的,我说对了,容器状态只是脚本的结果吗?也就是说,容器实际上与任何cloudify节点无关。 (我发现自己不能通过其他方式影响容器......) – Lootii

在我回答之前,我没有使用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命令。

+0

谢谢塔伦你在答案中的特别努力!我推荐[这个docker插件](https://github.com/docker/docker-py/blob/master/docker/api/container.py),它由更多的(当然不包括'start'中的'command' )。 – Lootii

+0

我试图添加一个'运行'生命周期。由于[docker插件](http://docs.getcloudify.org/4.0.0/plugins/docker/#create)似乎只支持'create','start','stop'和'remove_container',我认为没有新的变化是合理的。 – Lootii