使用 拉取圖像時ImagePull(),終端中有大量標準輸出顯示拉取進度,即;{"status":"Downloading","progressDetail":{"current":6433248,"total":7964517},"progress":"[========================================\u003e ] 6.433MB/7.965MB","id":"ae5cee1a3f12"}func PullImage(imageName string) bool { ctx := context.Background() cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { log.Error(err) return false } //TODO: Need to disable Stdout!! log.Info("\t\tPulling image " + imageName) out, err := cli.ImagePull(ctx, imageName, types.ImagePullOptions{}) if err != nil { log.Error(err) return false } defer out.Close() io.Copy(os.Stdout, out) log.Info("Pulled image " + imageName + " into host") return true}我搜索了文檔,但沒有找到禁用 StdOut 或更改詳細程度的方法。我不太了解這io.Copy(os.Stdout, out)條線,但據我所知,禁用它會導致沒有圖像被拉出。我們如何隱藏輸出ImagePull()?
1 回答

吃雞游戲
TA貢獻1829條經驗 獲得超7個贊
我不太了解 io.Copy(os.Stdout, out) 行,但據我所知,禁用它會導致沒有圖像被拉出。
io.Copyio.Reader簡單地從一個(在本例io.ReadCloser中也是一個)中讀取所有數據io.Reader并將其寫入一個io.Writer.
我的理解是,如果您不執行此步驟,則main返回之前ImagePull有機會在后臺完成。
但是,如果您確實執行io.Copy了 ,則復制會保持main足夠長的時間以使拉取實際完成。
在上面評論中的示例中,我一直main忙于for/sleep循環。
你看到所有輸出的原因是因為......好吧,你將輸出復制ImagePull到Stdoutwith io.Copy(os.Stdout, out),所以我們ImagePull在 stdout 中看到輸出也就不足為奇了。
相反,如果我們將所有輸出復制到某個使輸出消失的“黑洞”中,我們會main在復制發生時保持忙碌,同時抑制其所有輸出。
一種方法是使用io/ioutil's ioutil.Discard。這是一個io.Writer簡單地丟棄所有寫入它的數據。
因此,只需將您io.Copy(os.Stdout, out)的行替換為以下內容:
import {
"io/ioutil"
}
io.Copy(ioutil.Discard, out)
- 1 回答
- 0 關注
- 205 瀏覽
添加回答
舉報
0/150
提交
取消