@@ -3,6 +3,7 @@ package build
33import (
44 "fmt"
55 "reflect"
6+ "strings"
67
78 "github.com/docker/cli/cli/compose/loader"
89 compose "github.com/docker/cli/cli/compose/types"
@@ -24,7 +25,7 @@ type ImageBuildConfig struct {
2425 Args compose.MappingWithEquals `yaml:",omitempty" json:"args,omitempty"`
2526}
2627
27- func load (dict map [string ]interface {}) ([]ServiceConfig , error ) {
28+ func load (dict map [string ]interface {}, buildArgs [] string ) ([]ServiceConfig , error ) {
2829 section , ok := dict ["services" ]
2930 if ! ok {
3031 return nil , fmt .Errorf ("compose file doesn't declare any service" )
@@ -33,14 +34,14 @@ func load(dict map[string]interface{}) ([]ServiceConfig, error) {
3334 if ! ok {
3435 return nil , fmt .Errorf ("Invalid compose file: 'services' should be a map" )
3536 }
36- return loadServices (services )
37+ return loadServices (services , buildArgs )
3738}
3839
39- func loadServices (servicesDict map [string ]interface {}) ([]ServiceConfig , error ) {
40+ func loadServices (servicesDict map [string ]interface {}, buildArgs [] string ) ([]ServiceConfig , error ) {
4041 var services []ServiceConfig
4142
4243 for name , serviceDef := range servicesDict {
43- serviceConfig , err := loadService (name , serviceDef .(map [string ]interface {}))
44+ serviceConfig , err := loadService (name , serviceDef .(map [string ]interface {}), buildArgs )
4445 if err != nil {
4546 return nil , err
4647 }
@@ -49,14 +50,19 @@ func loadServices(servicesDict map[string]interface{}) ([]ServiceConfig, error)
4950 return services , nil
5051}
5152
52- func loadService (name string , serviceDict map [string ]interface {}) (* ServiceConfig , error ) {
53+ func loadService (name string , serviceDict map [string ]interface {}, buildArgs [] string ) (* ServiceConfig , error ) {
5354 serviceConfig := & ServiceConfig {Name : name }
55+ args := buildArgsToMap (buildArgs )
56+
5457 if err := loader .Transform (serviceDict , serviceConfig , loader.Transformer {
5558 TypeOf : reflect .TypeOf (ImageBuildConfig {}),
5659 Func : transformBuildConfig ,
5760 }); err != nil {
5861 return nil , err
5962 }
63+ if serviceConfig .Build != nil {
64+ serviceConfig .Build .mergeArgs (args )
65+ }
6066 return serviceConfig , nil
6167}
6268
@@ -70,3 +76,29 @@ func transformBuildConfig(data interface{}) (interface{}, error) {
7076 return data , errors .Errorf ("invalid type %T for service build" , value )
7177 }
7278}
79+
80+ func buildArgsToMap (array []string ) map [string ]string {
81+ result := make (map [string ]string )
82+ for _ , value := range array {
83+ parts := strings .SplitN (value , "=" , 2 )
84+ key := parts [0 ]
85+ if len (parts ) == 1 {
86+ result [key ] = ""
87+ } else {
88+ result [key ] = parts [1 ]
89+ }
90+ }
91+ return result
92+ }
93+
94+ func (m ImageBuildConfig ) mergeArgs (mapToMerge map [string ]string ) {
95+ for key := range m .Args {
96+ if val , ok := mapToMerge [key ]; ok {
97+ if val == "" {
98+ m .Args [key ] = nil
99+ } else {
100+ m .Args [key ] = & val
101+ }
102+ }
103+ }
104+ }
0 commit comments