如何在cloudify运行的docker容器中编辑自动运行命令的蓝图

如何在cloudify运行的docker容器中编辑自动运行命令的蓝图,docker,blueprint,cloudify,Docker,Blueprint,Cloudify,我想以cloudify的方式运行RYU controller的docker容器。我已经编写了一个蓝图文件,可以用它创建相关的部署,并最终启动docker容器 问题是,控制器(docker容器内)需要实现一个脚本才能正常工作,但我不知道如何修改blueprint文件以自动运行脚本。每次,我都要为目标键入docker exec CONTAINER ryu manager/path/simple_switch.py 那么有人知道命令应该放在蓝图中的什么地方吗。我试着把它包括在 interfaces:

我想以cloudify的方式运行RYU controller的docker容器。我已经编写了一个蓝图文件,可以用它创建相关的部署,并最终启动docker容器

问题是,控制器(docker容器内)需要实现一个脚本才能正常工作,但我不知道如何修改blueprint文件以自动运行脚本。每次,我都要为目标键入
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方面的经验,但我已经查看了文档以了解它的全部内容。这是我给你的建议

首先,我看了下面URL中的docker插件

它本身没有任何execute语句。因此,您应该从创建和启动生命周期中删除
命令。这样做可以确保运行默认的image命令

现在,您的任务是在容器内执行另一个命令。由于docker插件不支持该操作,因此最好获取新创建容器的容器ID。这应该可以使用一些输出参数捕获


现在,您希望在本地计算机或安装docker的远程计算机上执行命令。您可以将其设置为另一个生命周期,该生命周期从创建的容器中获取ID,并在主docker主机上执行
docker exec ryu manager/ryu/ryu/app/simple_switch.py
命令,我经常使用Cloudify,也经常使用docker。Docker插件有点“很好”,但它确实不是必需的。您只需从Cloudify脚本插件内部运行“docker exec”和“docker run”等命令,就可以得到相同的结果,并且不需要为使用docker找到不同的接口

例如,如果我有这个cloudify蓝图(简化):

yaml
节点模板:
我的应用程序:
类型:cloudify.nodes.SoftwareComponent
接口:
cloudify.interfaces.lifecycle:
创建:
实现:scripts/create.sh
开始:
实现:scripts/start.sh
关系:
-类型:cloudify.relationships.dependens\u
目标:虚拟机

我可以将这些脚本称为:

脚本/create.sh:

docker run-d ryu

脚本/start.sh


docker exec-it ryu-ryu-ryu-manager/ryu/ryu/app/simple\u-switch.py

谢谢Tarun,感谢您在回答问题时付出的特别努力!我推荐,它包含更多内容(当然在
start
中没有
command
),我尝试添加
run
生命周期。因为它似乎只支持<代码>创建< /代码>,<代码>开始<代码>,<代码>停止< /代码>和<代码> RevivyBase<代码>,我认为没有新的改变是合理的。哇!这听起来很酷很简单!我认为使用官方插件是必须的。谢谢!我试试看。你想出的方法很好用!但是旗帜可能是不可能的。容器无法通过
run-d
保持运行,
-t
导致
输入设备不是tty
错误。无论如何,这个解决方案真的很有帮助。再次感谢!嗨,@earthmant!我能再问一个问题吗?因为docker容器是由脚本运行的,所以容器的状态仅仅是脚本的结果,这对吗?也就是说,容器实际上与任何cloudify节点无关。(我发现自己无法通过其他方式影响容器…)在处理容器的这种方式中,实际上没有任何状态验证,正确。也许可以考虑使用Cloudify Kubernetes插件并将应用程序打包为一个Pod?