登录
首页 >  Golang >  Go问答

同时运行多个 Docker 镜像构建任务的 Docker Go 客户端

来源:stackoverflow

时间:2024-03-04 18:54:28 403浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《同时运行多个 Docker 镜像构建任务的 Docker Go 客户端》,涉及到,有需要的可以收藏一下

问题内容

我正在使用 docker 的 go 客户端来构建我的项目。这篇文章重点介绍了如何使用 go 客户端来做到这一点。我在三个 dockerfile(1.dockerfile2.dockerfile3.dockerfile)上调用 imagebuild 作为测试。这是我的代码:

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 服务器发送请求,而不是实际并行构建。这是真的?如果是这样,我如何并行构建我的项目?


解决方案


如果我正确理解你的问题,你有一台 docker 机器,你想在上面使用 GO 程序同时构建镜像。

我尝试对构建相同映像的 Dockerfile 执行相同的操作,根据我的理解,所有这些都是同时构建的。

这是我用来复制场景的 go 包 - https://github.com/nihanthd/stackoverflow/tree/master/docker

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

好了,本文到此结束,带大家了解了《同时运行多个 Docker 镜像构建任务的 Docker Go 客户端》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>