通过 Docker API 在 运行 容器中执行 powershell 命令
Execute powershell command in running container via Docker API
我想在 windows 主机上的 docker 容器 运行 中执行 powershell 命令。
我要执行的具体命令是"powershell Get-PSDrive C | Select-Object Used,Free"
我已经使用 Docker API 为 python 实现了这个,它很简单,就像调用:
cmd = "powershell Get-PSDrive C | Select-Object Used,Free"
output = container.exec_run(cmd)
这按预期工作,但我需要在 golang 中实现它。
但不知何故,我不清楚如何与 golang 的 Docker API 交互。我查看了 API 并被 hijackedSession
弄糊涂了。如何设置 ContainerExecCreate
、ContainerExecAttach
和 ContainerExecStart
的调用?
我希望 golang 脚本提供与 python 代码相同的结果:
Used Free
---- ----
199181606912 307151622144
然后我就可以解析了。
HijackedResponse 结构:
type HijackedResponse struct {
Conn net.Conn
Reader *bufio.Reader
}
您需要从 resp.Reader
复制响应,这是我的代码:
package main
import (
"bytes"
"context"
"fmt"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
"github.com/docker/docker/pkg/stdcopy"
"strings"
)
func readFromCommand() (string, error) {
cli, err := client.NewEnvClient()
if err != nil {
return "", err
}
ctx := context.Background()
config := types.ExecConfig{
Cmd: strings.Split("powershell Get-PSDrive C | Select-Object Used,Free", " "),
AttachStdout: true,
AttachStderr: true,
}
response, err := cli.ContainerExecCreate(ctx,
// container id
"cf59d65ab1", config)
if err != nil {
return "", err
}
execID := response.ID
resp, err := cli.ContainerExecAttach(ctx, execID, config)
if err != nil {
return "", err
}
defer resp.Close()
stdout := new(bytes.Buffer)
stderr := new(bytes.Buffer)
_, err = stdcopy.StdCopy(stdout, stderr, resp.Reader)
if err != nil {
return "", err
}
s := stdout.String()
fmt.Println(s)
i := stderr.String()
fmt.Println(i)
return s, nil
}
记得更改容器 ID。
我想在 windows 主机上的 docker 容器 运行 中执行 powershell 命令。
我要执行的具体命令是"powershell Get-PSDrive C | Select-Object Used,Free"
我已经使用 Docker API 为 python 实现了这个,它很简单,就像调用:
cmd = "powershell Get-PSDrive C | Select-Object Used,Free"
output = container.exec_run(cmd)
这按预期工作,但我需要在 golang 中实现它。
但不知何故,我不清楚如何与 golang 的 Docker API 交互。我查看了 API 并被 hijackedSession
弄糊涂了。如何设置 ContainerExecCreate
、ContainerExecAttach
和 ContainerExecStart
的调用?
我希望 golang 脚本提供与 python 代码相同的结果:
Used Free
---- ----
199181606912 307151622144
然后我就可以解析了。
HijackedResponse 结构:
type HijackedResponse struct {
Conn net.Conn
Reader *bufio.Reader
}
您需要从 resp.Reader
复制响应,这是我的代码:
package main
import (
"bytes"
"context"
"fmt"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
"github.com/docker/docker/pkg/stdcopy"
"strings"
)
func readFromCommand() (string, error) {
cli, err := client.NewEnvClient()
if err != nil {
return "", err
}
ctx := context.Background()
config := types.ExecConfig{
Cmd: strings.Split("powershell Get-PSDrive C | Select-Object Used,Free", " "),
AttachStdout: true,
AttachStderr: true,
}
response, err := cli.ContainerExecCreate(ctx,
// container id
"cf59d65ab1", config)
if err != nil {
return "", err
}
execID := response.ID
resp, err := cli.ContainerExecAttach(ctx, execID, config)
if err != nil {
return "", err
}
defer resp.Close()
stdout := new(bytes.Buffer)
stderr := new(bytes.Buffer)
_, err = stdcopy.StdCopy(stdout, stderr, resp.Reader)
if err != nil {
return "", err
}
s := stdout.String()
fmt.Println(s)
i := stderr.String()
fmt.Println(i)
return s, nil
}
记得更改容器 ID。