Я использую клиент 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 параллельно, а не фактически строит параллельно. Это правда? Если да, то как я могу строить свои проекты параллельно?