1
0
mirror of https://github.com/docker/compose.git synced 2025-04-08 17:05:13 +02:00

limit build concurrency according to --parallel

Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
This commit is contained in:
Nicolas De Loof 2023-01-03 10:09:05 +01:00 committed by Guillaume Lours
parent dcbd68a102
commit b96e27e0e7
2 changed files with 22 additions and 12 deletions

@ -51,14 +51,16 @@ func (s *composeService) build(ctx context.Context, project *types.Project, opti
opts := map[string]build.Options{}
args := flatten(options.Args.Resolve(envResolver(project.Environment)))
services, err := project.GetServices(options.Services...)
if err != nil {
return err
}
for _, service := range services {
return InDependencyOrder(ctx, project, func(ctx context.Context, name string) error {
if len(options.Services) > 0 && !utils.Contains(options.Services, name) {
return nil
}
service, err := project.GetService(name)
if err != nil {
return err
}
if service.Build == nil {
continue
return nil
}
imageName := api.GetImageNameOrDefault(service, project.Name)
buildOptions, err := s.toBuildOptions(project, service, imageName, options.SSHs)
@ -91,10 +93,11 @@ func (s *composeService) build(ctx context.Context, project *types.Project, opti
}}
}
opts[imageName] = buildOptions
}
_, err = s.doBuild(ctx, project, opts, options.Progress)
return err
_, err = s.doBuild(ctx, project, opts, options.Progress)
return err
}, func(traversal *graphTraversal) {
traversal.maxConcurrency = s.maxConcurrency
})
}
func (s *composeService) ensureImagesExists(ctx context.Context, project *types.Project, quietPull bool) error {

@ -47,7 +47,8 @@ type graphTraversal struct {
targetServiceStatus ServiceStatus
adjacentServiceStatusToSkip ServiceStatus
visitorFn func(context.Context, string) error
visitorFn func(context.Context, string) error
maxConcurrency int
}
func upDirectionTraversal(visitorFn func(context.Context, string) error) *graphTraversal {
@ -79,6 +80,9 @@ func InDependencyOrder(ctx context.Context, project *types.Project, fn func(cont
return err
}
t := upDirectionTraversal(fn)
for _, option := range options {
option(t)
}
return t.visit(ctx, graph)
}
@ -96,6 +100,9 @@ func (t *graphTraversal) visit(ctx context.Context, g *Graph) error {
nodes := t.extremityNodesFn(g)
eg, ctx := errgroup.WithContext(ctx)
if t.maxConcurrency > 0 {
eg.SetLimit(t.maxConcurrency)
}
t.run(ctx, g, eg, nodes)
return eg.Wait()