我想要同时从多个docker容器中获取日志(顺序无关紧要)。如果将types.ContainerLogsOption.Follow
设置为false,则可以按预期工作。
如果将types.ContainerLogsOption.Follow
设置为true,有时日志输出会在几条日志之后停滞不前,并且没有后续日志打印到stdout。
如果输出没有停滞,则按预期工作。
此外,如果我重启一个或全部容器,则该命令不像docker logs -f containerName
那样退出。
func (w *Whatever) Logs(options LogOptions) {
readers := []io.Reader{}
for _, container := range options.Containers {
responseBody, err := w.Docker.Client.ContainerLogs(context.Background(), container, types.ContainerLogsOptions{
ShowStdout: true,
ShowStderr: true,
Follow: options.Follow,
})
defer responseBody.Close()
if err != nil {
log.Fatal(err)
}
readers = append(readers, responseBody)
}
// concatenate all readers to one
multiReader := io.MultiReader(readers...)
_, err := stdcopy.StdCopy(os.Stdout, os.Stderr, multiReader)
if err != nil && err != io.EOF {
log.Fatal(err)
}
}
基本上,我的实现与docker logs
https://github.com/docker/docker/blob/master/cli/command/container/logs.go没有太大的区别,因此我想知道是什么原因导致了这些问题。
MultiReader返回一个Reader,它是提供的输入读取器的逻辑连接。它们按顺序读取。
。您正在尝试在转到下一个日志之前读取每个日志直到EOF。 - JimB