【问题标题】:Docker Golang SDK - How to redirect container stdout to a fileDocker Golang SDK - 如何将容器标准输出重定向到文件
【发布时间】:2017-09-12 03:38:53
【问题描述】:

使用 docker golang sdk 可以使用以下方法创建容器并将其输出绑定到stdout

resp, err := cli.ContainerCreate(ctx, &container.Config{
        Image:        "alpine",
        Cmd:          []string{"echo", "Hello World"},
        AttachStdout: true,
    }, nil, nil, "")

如何使用 SDK 将此输出重定向到文件? 我正在使用 docker 的官方 SDK - github.com/docker/docker/client

【问题讨论】:

  • 当您询问如何在 Golang 上使用包时,如果您提供该包的完整导入路径(github 或其他)会有所帮助。

标签: docker go docker-compose docker-machine docker-swarm


【解决方案1】:

你可以使用类似下面的东西

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

  f, err := os.Create("/tmp/clogs")

  io.Copy(f, out)

但请确保在启动容器后执行此操作,Create 只会创建容器而不启动它

【讨论】:

【解决方案2】:

docker 日志的格式包含每条消息的 8 字节标头,例如指示输出是在 stdout 还是 stderr。因此,不能像 Tarun Lalwani 在另一个答案中提到的那样简单地将日志输出复制到目的地,因为标头会被解释为字符,从而导致输出乱码。

不幸的是,客户文档甚至没有提到这个问题。 This article 稍微解释了一下,并提供了一个库来解决这个问题:

import (
  "github.com/docker/docker/client"
  "github.com/ahmetb/dlog"
)
  
// ---

reader, err := cli.ContainerLogs(ctx, resp.ID, nil)
if err != nil {
  panic(err)
}

file, err := os.Create("/path/to/your/file")
io.Copy(file, dlog.NewReader(reader))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多