Построить образы Docker параллельно с помощью Docker Go клиента - PullRequest
1 голос
/ 15 июня 2019

Я использую клиент 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 раскручивает три разных программы для создания трех разных изображений.

Мой вопрос: когда я запускаю это, вывод в stdout всегда одинаков и кажется детерминированным, что заставляет меня думать, что изображения на самом деле не были построены параллельно. Я не знаком с тем, как docker создает свои образы, и вполне возможно, что этот подход просто отправляет запросы на сервер Docker параллельно, а не фактически строит параллельно. Это правда? Если да, то как я могу строить свои проекты параллельно?

1 Ответ

1 голос
/ 17 июня 2019

Если я правильно понимаю ваш вопрос, у вас есть докер-машина, на которой вы хотите создавать изображения одновременно с помощью вашей программы GO.

Я пытался сделать то же самое с Dockerfiles, для которых создается один и тот же образ, и, насколько я понимаю, все они были построены одновременно.

Вот пакет go, который я использовал для репликации сценария - https://github.com/nihanthd/stackoverflow/tree/master/docker

Теперь в вашем случае, если вы использовали 3 разных файла Docker, то, конечно, они будут иметь разное время сборки, что означает, что вывод будет казаться детерминированным

...