【问题标题】:LXC run command on containersLXC 在容器上运行命令
【发布时间】:2017-06-23 12:55:04
【问题描述】:

有没有办法在主机上所有正在运行的 LXC 容器上运行命令,例如 fdisk -l?

lxc-execute requires --name option

【问题讨论】:

    标签: lxc


    【解决方案1】:

    只需几行bash就可以做到这一点,无需在主机上安装PHP。

    LXC1.0

    #!/bin/bash
    
    for container in $(lxc-ls -1 --running); do
        lxc-attach -n "$container" -- /bin/bash -c "fdisk -l"
    done
    

    LXD/LXC2.0+

    #!/bin/bash
    
    for container in $(lxc list volatile.last_state.power=RUNNING -c n --format csv); do    
        lxc exec "$container" "fdisk -l"
    done
    

    LXD/LXC3.0+(由@l422y 12/2020 添加)

    #!/bin/bash
    
    for container in $(lxc list volatile.last_state.power=RUNNING -c n --format csv); do    
        lxc exec "$container" -- fdisk -l
    done
    

    【讨论】:

    • @LarryWilliamson 感谢您的编辑,很高兴它有所帮助,现在人们不要为有用的答案投票 4k 浏览量.. 想删除
    【解决方案2】:

    以下命令将输出每个正在运行的容器的名称(并且仅是名称),每行一个:

    lxc ls volatile.last_state.power=RUNNING -c n --format csv
    

    我们可以在 bash for 循环中使用它,如下所示:

    for container in `lxc ls volatile.last_state.power=RUNNING -c n --format csv`; do lxc exec $container <command>; done
    

    【讨论】:

    • 不鼓励仅使用代码的答案,因为它们没有解释如何解决问题中的问题。请更新您的答案以解释它的作用以及它如何解决问题。请查看How do I write a good answer
    【解决方案3】:

    如果你在宿主节点上有一个 php 解释器,你可以使用这个 sn-p

    #!/usr/bin/env php
    <?php
    
    
    if(!@is_executable('/usr/bin/lxc-attach'))
    {
        print "This host is probably not an LXC host.\n";
        exit;
    
    
    
    
    $ret=@exec('/usr/bin/lxc-ls');
    $vzs=explode(' ',$ret);
    
    exec('clear');
    
    print "Executing \"".$argv[1]."\" command on all containers...\n";
    sleep(1);
    
    foreach($vzs as $k)
    {
        print "Executing \"".$argv[1]."\" command on $k...\n";
        passthru('/usr/bin/lxc-attach -n '.$k.' -- '.$argv[1]);
        echo PHP_EOL;
    }
    
    echo PHP_EOL;
    

    【讨论】:

    • 纯代码答案不被视为好的答案。请通过提供更多上下文和解释来改进您的答案。
    【解决方案4】:
    from pylxd import Client
    import os
    conn=Client()
    
    def ExecuteCommandOn(command):
        for i in conn.containers.all():
            if i.status.upper()=="RUNNING":
               query = "lxc exec %s -- %s" % (i.name,command)
                os.system(query)
    
    def main():
        ExecuteCommandOn("uptime")
    
    if __name__=="__main__":
        main()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 2020-07-28
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      相关资源
      最近更新 更多