だから私は、チェーンを実行しようとしまし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 のコンテナーで一連のコマンドを実行することです。