为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 client-go 在 Pod 的容器中执行多个命令?

如何使用 client-go 在 Pod 的容器中执行多个命令?

Go
慕哥9229398 2022-05-23 15:47:06
所以我尝试在 Pod 的容器上使用 执行链,即多个命令client-go,它似乎只适用于某些命令,ls例如这是我尝试过的:    req := client.CoreV1().RESTClient().Post().Resource("pods").Name(pod.Name).Namespace(pod.ObjectMeta.Namespace).SubResource("exec") // .Param("container", containerName)    scheme := runtime.NewScheme()    if err := _v1.AddToScheme(scheme); err != nil {        panic(err.Error())    }    parameterCodec := runtime.NewParameterCodec(scheme)    req.VersionedParams(&_v1.PodExecOptions{        Stdin:     false,        Stdout:    true,        Stderr:    true,        TTY:       false,        Container: containerName,        Command:   strings.Fields("/bin/sh -c " + command),    }, parameterCodec)    exec, err := remotecommand.NewSPDYExecutor(restConfig, "POST", req.URL())    if err != nil {        panic(err.Error())    }    var stdout, stderr bytes.Buffer    err = exec.Stream(remotecommand.StreamOptions{        Stdin:  nil,        Stdout: &stdout,        Stderr: &stderr,        Tty:    false,    })    if err != nil {        panic(err.Error())    }log.Printf("Output from pod: %v", stdout.String())log.Printf("Error from pod: %v", stderr.String())当command变量只是一个简单的ls -l时,我得到了所需的输出。但是当我尝试做类似的事情'ls -l && echo hello'时会产生错误command terminated with exit code 2。如果我只放echo hello. hello但是,如果我删除Bourne Shell前缀/bin/sh -c并且Command属性等于,它确实会产生所需的输出string.Fields("echo hello"),但是这种方法不允许我链接命令。总而言之,我想做的是在 Pod 的容器上执行一系列命令。
查看完整描述

1 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

类型的corev1.PodExecOptions.Command接受值[]string。


req.VersionedParams(&_v1.PodExecOptions{

  Stdin:     false,

  Stdout:    true,

  Stderr:    true,

  TTY:       false,

  Container: containerName,

  Command:   cmds,

}, parameterCodec)

其中,cmds可以是:


cmds := []string{

    "sh",

    "-c",

    "echo $HOME; ls -l && echo hello",

    }

输出:


/root

total 68

drwxr-xr-x   2 root root 4096 Feb 24 00:00 bin

drwxr-xr-x   2 root root 4096 Feb  1 17:09 boot

drwxr-xr-x   2 root root 4096 Feb 24 00:00 mnt

drwxr-xr-x   2 root root 4096 Feb 24 00:00 opt

dr-xr-xr-x 396 root root    0 Mar 19 11:47 proc

drwx------   2 root root 4096 Feb 24 00:00 root

.

.

hello

说明: 蒂姆的回答


command: ["/bin/sh","-c"]

args: ["command one; command two && command three"]

该命令["/bin/sh", "-c"]说“运行一个外壳,并执行以下指令”。然后将 args 作为命令传递给 shell。在 shell 脚本中,asemicolon分隔命令,&&如果第一个成功,则有条件地运行以下命令。在上面的例子中,它总是在 commandone之后运行 command two,并且只有在threecommandtwo成功时才运行 command 。


注意: 对于 bash,它将类似于以下内容:


cmds := []string{

     "bash",

     "-c",

     `export MYSQL_PWD=${MYSQL_ROOT_PASSWORD}

mysql -h localhost -nsLNE -e "select 1;" 2>/dev/null | grep -v "*"`,

                    },


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 548 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号