2025-03-27 16:27:41 +08:00

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