@@ -13,6 +13,12 @@ type Build struct {
1313 Context string
1414 Dockerfile string
1515 Args map [string ]* string
16+ CacheFrom []* string
17+ Labels map [string ]* string
18+ // TODO: ShmSize (can be a string or int?) for v3.5
19+ Target string
20+ // Note: as of Sep 2018 this is undocumented but supported by docker-compose
21+ Network string
1622}
1723
1824// MarshalYAML implements the Marshaller interface.
@@ -27,6 +33,18 @@ func (b Build) MarshalYAML() (interface{}, error) {
2733 if len (b .Args ) > 0 {
2834 m ["args" ] = b .Args
2935 }
36+ if len (b .CacheFrom ) > 0 {
37+ m ["cache_from" ] = b .CacheFrom
38+ }
39+ if len (b .Labels ) > 0 {
40+ m ["labels" ] = b .Labels
41+ }
42+ if b .Target != "" {
43+ m ["target" ] = b .Target
44+ }
45+ if b .Network != "" {
46+ m ["network" ] = b .Network
47+ }
3048 return m , nil
3149}
3250
@@ -52,6 +70,22 @@ func (b *Build) UnmarshalYAML(unmarshal func(interface{}) error) error {
5270 return err
5371 }
5472 b .Args = args
73+ case "cache_from" :
74+ cacheFrom , err := handleBuildCacheFrom (mapValue )
75+ if err != nil {
76+ return err
77+ }
78+ b .CacheFrom = cacheFrom
79+ case "labels" :
80+ labels , err := handleBuildLabels (mapValue )
81+ if err != nil {
82+ return err
83+ }
84+ b .Labels = labels
85+ case "target" :
86+ b .Target = mapValue .(string )
87+ case "network" :
88+ b .Network = mapValue .(string )
5589 default :
5690 // Ignore unknown keys
5791 continue
@@ -67,15 +101,44 @@ func handleBuildArgs(value interface{}) (map[string]*string, error) {
67101 var args map [string ]* string
68102 switch v := value .(type ) {
69103 case map [interface {}]interface {}:
70- return handleBuildArgMap (v )
104+ return handleBuildOptionMap (v )
71105 case []interface {}:
72- return handleBuildArgSlice (v )
106+ return handleBuildArgsSlice (v )
73107 default :
74108 return args , fmt .Errorf ("Failed to unmarshal Build args: %#v" , value )
75109 }
76110}
77111
78- func handleBuildArgSlice (s []interface {}) (map [string ]* string , error ) {
112+ func handleBuildCacheFrom (value interface {}) ([]* string , error ) {
113+ var cacheFrom []* string
114+ switch v := value .(type ) {
115+ case []interface {}:
116+ return handleBuildCacheFromSlice (v )
117+ default :
118+ return cacheFrom , fmt .Errorf ("Failed to unmarshal Build cache_from: %#v" , value )
119+ }
120+ }
121+
122+ func handleBuildLabels (value interface {}) (map [string ]* string , error ) {
123+ var labels map [string ]* string
124+ switch v := value .(type ) {
125+ case map [interface {}]interface {}:
126+ return handleBuildOptionMap (v )
127+ default :
128+ return labels , fmt .Errorf ("Failed to unmarshal Build labels: %#v" , value )
129+ }
130+ }
131+
132+ func handleBuildCacheFromSlice (s []interface {}) ([]* string , error ) {
133+ var args = []* string {}
134+ for _ , arg := range s {
135+ strArg := arg .(string )
136+ args = append (args , & strArg )
137+ }
138+ return args , nil
139+ }
140+
141+ func handleBuildArgsSlice (s []interface {}) (map [string ]* string , error ) {
79142 var args = map [string ]* string {}
80143 for _ , arg := range s {
81144 // check if a value is provided
@@ -93,7 +156,8 @@ func handleBuildArgSlice(s []interface{}) (map[string]*string, error) {
93156 return args , nil
94157}
95158
96- func handleBuildArgMap (m map [interface {}]interface {}) (map [string ]* string , error ) {
159+ // Used for args and labels
160+ func handleBuildOptionMap (m map [interface {}]interface {}) (map [string ]* string , error ) {
97161 args := map [string ]* string {}
98162 for mapKey , mapValue := range m {
99163 var argValue string
0 commit comments