我正在使用 Docker 的 Go 客戶端來構(gòu)建我的項目。我正在調(diào)用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 來構(gòu)建三個不同的鏡像。我的問題是:當(dāng)我運行這個時,標(biāo)準(zhǔn)輸出的輸出總是相同的并且似乎是確定性的,這讓我認(rèn)為圖像實際上并不是并行構(gòu)建的。我不熟悉 docker 如何構(gòu)建其鏡像,而且這種方法似乎完全有可能只是并行向 docker 服務(wù)器發(fā)送請求,而不是實際并行構(gòu)建。這是真的?如果是這樣,我如何并行構(gòu)建我的項目?
1 回答

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