使用Docker Go客户端并行构建Docker映像

时间:2019-06-14 22:08:15

标签: docker go dockerfile

我正在使用Docker的Go客户端来构建我的项目。 post重点介绍了如何使用Go客户端执行此操作。我在我的三个Dockerfile(t.AddId("one"); ImageBuild1.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() } 用于将目录路径作为Docker的上下文。 GetContext衍生出三个不同的goroutine,以构建三个不同的图像。

我的问题是:运行此命令时,stdout的输出始终是相同的,并且似乎是确定性的,这使我认为图像实际上并不是并行构建的。我不熟悉docker如何构建其映像,并且这种方法似乎完全有可能只是将请求并行发送到docker服务器,而不是实际并行构建。这是真的?如果是这样,我如何并行构建项目?

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,则您有台docker-machine,您想在其上使用GO程序同时构建映像。

我试图对具有相同映像的Dockerfile执行相同的操作,并且据我所知,它们都是同时构建的。

这是我用来复制方案的go软件包-https://github.com/nihanthd/stackoverflow/tree/master/docker

现在,如果您使用的是3个不同的docker文件,那么它们肯定会有不同的构建时间,这意味着输出似乎是确定性的