簡體   English   中英

Docker Golang SDK - 如何將容器標准輸出重定向到文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM