You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在使用Docker Go SDK时打印bash -xc命令的执行内容?

解决Docker Go SDK无法捕获Bash命令追踪输出的问题

你遇到的问题核心是没有在Bash命令中启用调试模式,同时日志捕获配置也没包含标准错误输出——这正是直接用docker run时-x参数和默认日志行为帮你做的事。

为什么直接docker run能看到命令?

当你执行docker run ubuntu /bin/bash -xc "echo test; echo hello "时,-x参数让Bash开启了调试追踪模式:它会把即将执行的命令行前缀+输出到标准错误(stderr),而docker run默认会同时把容器的stdout和stderr转发到终端,所以你能看到命令本身和执行结果。

如何在Go SDK中实现同样效果?

需要做两个关键修改:

  1. 给Bash添加-x参数,启用调试模式
  2. 在日志捕获时同时开启ShowStderr: true,因为命令追踪输出是到stderr的

修改后的代码示例:

package main
import (
    "context"
    "io"
    "os"
    "log"
    "github.com/docker/docker/api/types"
    "github.com/docker/docker/api/types/container"
    "github.com/docker/docker/client"
    "github.com/docker/docker/pkg/stdcopy"
)
func main() {
    ctx := context.Background()
    cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
    if err != nil {
        panic(err)
    }
    script := `
echo hello
echo test
`
    reader, err := cli.ImagePull(ctx, "docker.io/library/ubuntu", types.ImagePullOptions{})
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, reader)
    resp, err := cli.ContainerCreate(ctx, &container.Config{
        Image: "ubuntu",
        // 这里添加了-x参数,启用Bash调试模式
        Cmd: []string{"/bin/bash", "-xc", script},
    }, nil, nil, nil, "")
    if err != nil {
        panic(err)
    }
    if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
        panic(err)
    }
    statusCh, errCh := cli.ContainerWait(ctx, resp.ID, container.WaitConditionNotRunning)
    select {
    case err := <-errCh:
        if err != nil {
            panic(err)
        }
    case <-statusCh:
    }
    out, err := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{
        ShowStdout: true,
        // 新增:开启stderr捕获,因为Bash的调试输出在stderr
        ShowStderr: true,
    })
    if err != nil {
        panic(err)
    }
    stdcopy.StdCopy(os.Stdout, os.Stderr, out)
}

修改说明:

  • 在Cmd数组中把"/bin/bash"的参数从-c改成-xc,-x就是开启Bash的调试追踪模式
  • 在ContainerLogsOptions中添加ShowStderr: true,确保能捕获到Bash输出的命令行内容
  • stdcopy.StdCopy会自动把stdout和stderr分别转发到终端的对应流,保持输出和直接docker run一致

运行效果:

修改后运行代码,你会看到和直接docker run完全一致的输出:

+ echo hello
hello
+ echo test
test

内容的提问来源于stack exchange,提问作者Gasim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:02:47