【发布时间】:2020-06-29 11:34:58
【问题描述】:
所以我尝试使用 client-go 在 Pod 的容器上执行一个链,即多个命令,它似乎只适用于像 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,它不会输出任何内容。但是,如果我删除Bourne Shell 前缀/bin/sh -c 并且Command 属性等于string.Fields("echo hello"),它确实会产生所需的输出hello,但是这种方法不允许我链接命令。
总而言之,我要做的是在 Pod 的容器上执行一系列命令。
【问题讨论】:
-
我认为
Command应该是[ "sh", "-c", "ls -l && echo hello" ]而不是[ "sh", "-c", "ls", "-l", "&&", "echo", "hello" ]这是 string.Fields 拆分它的方式。 -
不知道有没有办法获取远程执行命令的退出码?
标签: go kubernetes sh client-go