@@ -13,6 +13,12 @@ type Build struct {
13
13
Context string
14
14
Dockerfile string
15
15
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
16
22
}
17
23
18
24
// MarshalYAML implements the Marshaller interface.
@@ -27,6 +33,18 @@ func (b Build) MarshalYAML() (interface{}, error) {
27
33
if len (b .Args ) > 0 {
28
34
m ["args" ] = b .Args
29
35
}
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
+ }
30
48
return m , nil
31
49
}
32
50
@@ -52,6 +70,22 @@ func (b *Build) UnmarshalYAML(unmarshal func(interface{}) error) error {
52
70
return err
53
71
}
54
72
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 )
55
89
default :
56
90
// Ignore unknown keys
57
91
continue
@@ -67,15 +101,44 @@ func handleBuildArgs(value interface{}) (map[string]*string, error) {
67
101
var args map [string ]* string
68
102
switch v := value .(type ) {
69
103
case map [interface {}]interface {}:
70
- return handleBuildArgMap (v )
104
+ return handleBuildOptionMap (v )
71
105
case []interface {}:
72
- return handleBuildArgSlice (v )
106
+ return handleBuildArgsSlice (v )
73
107
default :
74
108
return args , fmt .Errorf ("Failed to unmarshal Build args: %#v" , value )
75
109
}
76
110
}
77
111
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 ) {
79
142
var args = map [string ]* string {}
80
143
for _ , arg := range s {
81
144
// check if a value is provided
@@ -93,7 +156,8 @@ func handleBuildArgSlice(s []interface{}) (map[string]*string, error) {
93
156
return args , nil
94
157
}
95
158
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 ) {
97
161
args := map [string ]* string {}
98
162
for mapKey , mapValue := range m {
99
163
var argValue string
0 commit comments