[英]Docker Golang SDK - How to redirect container stdout to a file
使用 docker golang sdk,可以使用以下方法創建容器並將其輸出綁定到stdout
。
resp, err := cli.ContainerCreate(ctx, &container.Config{
Image: "alpine",
Cmd: []string{"echo", "Hello World"},
AttachStdout: true,
}, nil, nil, "")
如何使用 SDK 將此輸出重定向到文件? 我正在使用github.com/docker/docker/client
的官方 SDK - github.com/docker/docker/client
你可以使用類似下面的東西
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 只會創建容器而不啟動它
docker 日志的格式包含每條消息的 8 個字節的標頭,例如指示輸出是在stdout
還是stderr
。 因此,不能像 Tarun Lalwani 在另一個答案中提到的那樣簡單地將日志輸出復制到目的地,因為標題隨后會被解釋為字符,從而導致輸出亂碼。
不幸的是,客戶文檔甚至沒有提到這個問題。 這篇文章解釋了一下,並提供了一個庫來解決這個問題:
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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.