使用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
答案 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))