98 lines
2.2 KiB
Go
98 lines
2.2 KiB
Go
package docker
|
|
|
|
import (
|
|
"bufio"
|
|
"context"
|
|
"io"
|
|
|
|
"github.com/docker/docker/api/types"
|
|
)
|
|
|
|
// ExecConfig 命令执行配置
|
|
type ExecConfig struct {
|
|
Cmd []string
|
|
AttachStdout bool
|
|
AttachStderr bool
|
|
Detach bool
|
|
Tty bool
|
|
}
|
|
|
|
// DefaultExecConfig 返回默认的命令执行配置
|
|
func DefaultExecConfig(cmd []string) ExecConfig {
|
|
return ExecConfig{
|
|
Cmd: cmd,
|
|
AttachStdout: true,
|
|
AttachStderr: true,
|
|
Detach: false,
|
|
Tty: false,
|
|
}
|
|
}
|
|
|
|
// ExecuteCommand 在容器中执行命令并返回执行ID
|
|
func ExecuteCommand(ctx context.Context, containerID string, config ExecConfig) (string, error) {
|
|
cli := GetClient()
|
|
|
|
execConfig := types.ExecConfig{
|
|
Cmd: config.Cmd,
|
|
AttachStdout: config.AttachStdout,
|
|
AttachStderr: config.AttachStderr,
|
|
Detach: config.Detach,
|
|
Tty: config.Tty,
|
|
}
|
|
|
|
execResp, err := cli.ContainerExecCreate(ctx, containerID, execConfig)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return execResp.ID, nil
|
|
}
|
|
|
|
// StartExecCommand 启动已创建的命令执行
|
|
func StartExecCommand(ctx context.Context, execID string) (*bufio.Reader, error) {
|
|
cli := GetClient()
|
|
|
|
resp, err := cli.ContainerExecAttach(ctx, execID, types.ExecStartCheck{})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return resp.Reader, nil
|
|
}
|
|
|
|
// GetExecOutput 获取执行命令的输出
|
|
func GetExecOutput(ctx context.Context, execID string) (string, error) {
|
|
cli := GetClient()
|
|
|
|
// 附加到命令执行
|
|
resp, err := cli.ContainerExecAttach(ctx, execID, types.ExecStartCheck{})
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer resp.Close()
|
|
|
|
// 读取输出
|
|
output, err := io.ReadAll(resp.Reader)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return string(output), nil
|
|
}
|
|
|
|
// GetExecStatus 获取命令执行状态
|
|
func GetExecStatus(ctx context.Context, execID string) (types.ContainerExecInspect, error) {
|
|
cli := GetClient()
|
|
return cli.ContainerExecInspect(ctx, execID)
|
|
}
|
|
|
|
// ExecuteCommandWithOutput 执行命令并直接返回输出
|
|
func ExecuteCommandWithOutput(ctx context.Context, containerID string, cmd []string) (string, error) {
|
|
execID, err := ExecuteCommand(ctx, containerID, DefaultExecConfig(cmd))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return GetExecOutput(ctx, execID)
|
|
}
|