我正在尝试使用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())
意图:允许实时控制台输出到网络。
答案 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())
}