如何在使用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中实现同样效果?
需要做两个关键修改:
- 给Bash添加
-x参数,启用调试模式 - 在日志捕获时同时开启
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
相关产品推荐
相关产品推荐

