Docker Golang SDK - 如何将容器标准输出重定向到文件

时间:2017-09-12 03:38:53

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

使用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

2 个答案:

答案 0 :(得分: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将仅创建容器而不启动容器

答案 1 :(得分:0)

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))