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) }