我正在使用 Docker 的 Go 客戶端來構建我的項目。我正在調用ImageBuild我的三個 Dockerfile(1.Dockerfile、2.Dockerfile和3.Dockerfile)作為測試。這是我的代碼:func GetContext(filePath string) io.Reader {? ? // Use homedir.Expand to resolve paths like '~/repos/myrepo'? ? filePath, _ = homedir.Expand(filePath)? ? ctx, err := archive.TarWithOptions(filePath, &archive.TarOptions{})? ? if err != nil {? ? ? ? panic(err)? ? }? ? return ctx}func testImageBuild() {? ? ctx := context.Background()? ? cli, err := client.NewEnvClient()? ? if err != nil {? ? ? ? log.Fatal(err, " :unable to init client")? ? }? ? var wg sync.WaitGroup? ? for i := 0; i < 3; i++ {? ? ? ? wg.Add(1)? ? ? ? go func(i int) {? ? ? ? ? ? defer wg.Done()? ? ? ? ? ? dockerFile := fmt.Sprintf("%d.Dockerfile", i)? ? ? ? ? ? imageBuildResponse, err := cli.ImageBuild(? ? ? ? ? ? ? ? ctx,? ? ? ? ? ? ? ? GetContext("."),? ? ? ? ? ? ? ? types.ImageBuildOptions{? ? ? ? ? ? ? ? ? ? Dockerfile: dockerFile,? ? ? ? ? ? ? ? ? ? Tags:? ? ? ?[]string{fmt.Sprintf("devbuild_%d", i)},? ? ? ? ? ? ? ? })? ? ? ? ? ? if err != nil {? ? ? ? ? ? ? ? log.Fatal(err, " :unable to build docker image"+string(1))? ? ? ? ? ? }? ? ? ? ? ? defer imageBuildResponse.Body.Close()? ? ? ? ? ? _, err = io.Copy(os.Stdout, imageBuildResponse.Body)? ? ? ? ? ? if err != nil {? ? ? ? ? ? ? ? log.Fatal(err, " :unable to read image build response "+string(1))? ? ? ? ? ? }? ? ? ? }(i)? ? }? ? wg.Wait()}func main() {? ? testImageBuild()}GetContext用于將目錄路徑打包為 Docker 的上下文。testImageBuild派生出三個不同的 goroutine 來構建三個不同的鏡像。我的問題是:當我運行這個時,標準輸出的輸出總是相同的并且似乎是確定性的,這讓我認為圖像實際上并不是并行構建的。我不熟悉 docker 如何構建其鏡像,而且這種方法似乎完全有可能只是并行向 docker 服務器發送請求,而不是實際并行構建。這是真的?如果是這樣,我如何并行構建我的項目?
1 回答

神不在的星期二
TA貢獻1963條經驗 獲得超6個贊
如果我正確理解你的問題,你有一臺 docker 機器,你想在上面使用 GO 程序同時構建圖像。
我嘗試對構建相同映像的 Dockerfile 執行相同的操作,根據我的理解,所有這些都是同時構建的。
現在,在您的情況下,如果您使用 3 個不同的 docker 文件,那么它們肯定會有不同的構建時間,這意味著輸出似乎是確定性的
- 1 回答
- 0 關注
- 169 瀏覽
添加回答
舉報
0/150
提交
取消