diff --git a/local/compose/build.go b/local/compose/build.go index 9ba06d31c..eb78869dc 100644 --- a/local/compose/build.go +++ b/local/compose/build.go @@ -45,24 +45,21 @@ func (s *composeService) Build(ctx context.Context, project *types.Project, opti opts := map[string]build.Options{} imagesToBuild := []string{} - args := map[string]string{} - for k, v := range options.Args.Resolve(func(s string) (string, bool) { + args := flatten(options.Args.Resolve(func(s string) (string, bool) { s, ok := project.Environment[s] return s, ok - }).RemoveEmpty() { - args[k] = *v - } + })) for _, service := range project.Services { if service.Build != nil { imageName := getImageName(service, project.Name) imagesToBuild = append(imagesToBuild, imageName) - buildOptions, err := s.toBuildOptions(service, imageName) + buildOptions, err := s.toBuildOptions(project, service, imageName) if err != nil { return err } buildOptions.Pull = options.Pull - buildOptions.BuildArgs = args + buildOptions.BuildArgs = mergeArgs(buildOptions.BuildArgs, args) buildOptions.NoCache = options.NoCache opts[imageName] = buildOptions buildOptions.CacheFrom, err = buildflags.ParseCacheEntry(service.Build.CacheFrom) @@ -142,7 +139,7 @@ func (s *composeService) getBuildOptions(project *types.Project, images map[stri continue } imagesToBuild = append(imagesToBuild, imageName) - opt, err := s.toBuildOptions(service, imageName) + opt, err := s.toBuildOptions(project, service, imageName) if err != nil { return nil, nil, err } @@ -263,11 +260,14 @@ func (s *composeService) build(ctx context.Context, project *types.Project, opts return imagesBuilt, err } -func (s *composeService) toBuildOptions(service types.ServiceConfig, imageTag string) (build.Options, error) { +func (s *composeService) toBuildOptions(project *types.Project, service types.ServiceConfig, imageTag string) (build.Options, error) { var tags []string tags = append(tags, imageTag) - var buildArgs map[string]string + buildArgs := flatten(service.Build.Args.Resolve(func(s string) (string, bool) { + s, ok := project.Environment[s] + return s, ok + })) var plats []specs.Platform if service.Platform != "" { @@ -283,7 +283,7 @@ func (s *composeService) toBuildOptions(service types.ServiceConfig, imageTag st ContextPath: service.Build.Context, DockerfilePath: service.Build.Dockerfile, }, - BuildArgs: flatten(mergeArgs(service.Build.Args, buildArgs)), + BuildArgs: buildArgs, Tags: tags, Target: service.Build.Target, Exports: []bclient.ExportEntry{{Type: "image", Attrs: map[string]string{}}}, @@ -292,11 +292,11 @@ func (s *composeService) toBuildOptions(service types.ServiceConfig, imageTag st }, nil } -func flatten(in types.MappingWithEquals) map[string]string { +func flatten(in types.MappingWithEquals) types.Mapping { if len(in) == 0 { return nil } - out := make(map[string]string) + out := types.Mapping{} for k, v := range in { if v == nil { continue @@ -306,15 +306,12 @@ func flatten(in types.MappingWithEquals) map[string]string { return out } -func mergeArgs(src types.MappingWithEquals, values map[string]string) types.MappingWithEquals { - for key := range src { - if val, ok := values[key]; ok { - if val == "" { - src[key] = nil - } else { - src[key] = &val - } +func mergeArgs(m ...types.Mapping) types.Mapping { + merged := types.Mapping{} + for _, mapping := range m { + for key, val := range mapping { + merged[key] = val } } - return src + return merged }