亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 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 關注
  • 485 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號