所以我尝试在 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 的容器上执行一系列命令。