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

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


慕哥9229398
浏览 549回答 1
1回答

慕码人2483693

类型的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",    }输出:/roottotal 68drwxr-xr-x   2 root root 4096 Feb 24 00:00 bindrwxr-xr-x   2 root root 4096 Feb  1 17:09 bootdrwxr-xr-x   2 root root 4096 Feb 24 00:00 mntdrwxr-xr-x   2 root root 4096 Feb 24 00:00 optdr-xr-xr-x 396 root root    0 Mar 19 11:47 procdrwx------   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 "*"`,                    },
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go