如何通过websocket获取Docker容器输出?

时间:2018-01-22 23:42:43

标签: docker go stdout


我正在尝试使用fmt将docker容器的输出发送到控制台,但是当我尝试这样做时,我得到了这个。

&{0xc0422a65c0 {0 0} false <nil> 0x6415a0 0x641540}

我该怎么做?这是我的完整代码。

func main() {
    imageName := "hidden/hidden"

ctx := context.Background()

cli, err := client.NewClient("tcp://0.0.0.0:0000", "v0.00", nil, nil)
if err != nil {
    panic(err)
}

fmt.Println("Pulling \"" + imageName + "\"")
_, err = cli.ImagePull(ctx, imageName, types.ImagePullOptions{})
if err != nil {
    panic(err)
}

containerConfig := &container.Config{
    Image: imageName,
    Cmd: []string{"./app/start.sh", "--no-wizard"},
}

resp, err := cli.ContainerCreate(ctx, containerConfig, nil, nil, "")
if err != nil {
    panic(err)
}

if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
    panic(err)
}

timer := time.NewTimer(time.Minute)
go func() {
    <-timer.C
    if err := cli.ContainerStop(ctx, resp.ID, nil); err != nil {
        panic(err)
    }
}()

out, err := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true, ShowStderr: true, Follow: true})
if err != nil {
    panic(err)
}

io.Copy(os.Stdout, out) // This is what I want to change to print with "fmt".
}

尝试:(但在容器完成之前不会显示。)

buf := new(bytes.Buffer)
buf.ReadFrom(out)
fmt.Println(buf.String())

意图:允许实时控制台输出到网络。

2 个答案:

答案 0 :(得分:1)

&{0xc0422a65c0 {0 0} false <nil> 0x6415a0 0x641540}输出不错。这是一个完美的结构输出。我认为主要问题在于你缺乏golang经验。

我也是初学者,我可以想象,当你看到上面的输出时,你会想到&#34;我犯了错误&#34;

不,你没有。当你试图打印出包含指针的结构时,它是默认的fmt行为。

结帐而不是fmt.Println

fmt.Printf("%+v\n", out)

这个答案代表我的假设,但如果是这种情况,请告诉我更多信息。

答案 1 :(得分:1)

这似乎是我的问题的答案,我做了一些关于扫描仪的搜索,如CeriseLimón评论。其他似乎遇到我所遇问题的人都可以使用此代码。感谢所有帮助。

scanner := bufio.NewScanner(out)
scanner.Split(bufio.ScanLines)
for scanner.Scan() {
    fmt.Println(scanner.Text())
}