@@ -95,7 +95,7 @@ func (s *composeService) pull(ctx context.Context, project *types.Project, opts
95
95
}
96
96
97
97
eg .Go (func () error {
98
- err := s .pullServiceImage (ctx , service , info , s .configFile (), w , false )
98
+ _ , err := s .pullServiceImage (ctx , service , info , s .configFile (), w , false )
99
99
if err != nil {
100
100
if ! opts .IgnoreFailures {
101
101
if service .Build != nil {
@@ -118,20 +118,20 @@ func (s *composeService) pull(ctx context.Context, project *types.Project, opts
118
118
return err
119
119
}
120
120
121
- func (s * composeService ) pullServiceImage (ctx context.Context , service types.ServiceConfig , info moby.Info , configFile driver.Auth , w progress.Writer , quietPull bool ) error {
121
+ func (s * composeService ) pullServiceImage (ctx context.Context , service types.ServiceConfig , info moby.Info , configFile driver.Auth , w progress.Writer , quietPull bool ) ( string , error ) {
122
122
w .Event (progress.Event {
123
123
ID : service .Name ,
124
124
Status : progress .Working ,
125
125
Text : "Pulling" ,
126
126
})
127
127
ref , err := reference .ParseNormalizedNamed (service .Image )
128
128
if err != nil {
129
- return err
129
+ return "" , err
130
130
}
131
131
132
132
repoInfo , err := registry .ParseRepositoryInfo (ref )
133
133
if err != nil {
134
- return err
134
+ return "" , err
135
135
}
136
136
137
137
key := repoInfo .Index .Name
@@ -141,12 +141,12 @@ func (s *composeService) pullServiceImage(ctx context.Context, service types.Ser
141
141
142
142
authConfig , err := configFile .GetAuthConfig (key )
143
143
if err != nil {
144
- return err
144
+ return "" , err
145
145
}
146
146
147
147
buf , err := json .Marshal (authConfig )
148
148
if err != nil {
149
- return err
149
+ return "" , err
150
150
}
151
151
152
152
stream , err := s .apiClient ().ImagePull (ctx , service .Image , moby.ImagePullOptions {
@@ -159,7 +159,7 @@ func (s *composeService) pullServiceImage(ctx context.Context, service types.Ser
159
159
Status : progress .Error ,
160
160
Text : "Error" ,
161
161
})
162
- return WrapCategorisedComposeError (err , PullFailure )
162
+ return "" , WrapCategorisedComposeError (err , PullFailure )
163
163
}
164
164
165
165
dec := json .NewDecoder (stream )
@@ -169,10 +169,10 @@ func (s *composeService) pullServiceImage(ctx context.Context, service types.Ser
169
169
if err == io .EOF {
170
170
break
171
171
}
172
- return WrapCategorisedComposeError (err , PullFailure )
172
+ return "" , WrapCategorisedComposeError (err , PullFailure )
173
173
}
174
174
if jm .Error != nil {
175
- return WrapCategorisedComposeError (errors .New (jm .Error .Message ), PullFailure )
175
+ return "" , WrapCategorisedComposeError (errors .New (jm .Error .Message ), PullFailure )
176
176
}
177
177
if ! quietPull {
178
178
toPullProgressEvent (service .Name , jm , w )
@@ -183,7 +183,12 @@ func (s *composeService) pullServiceImage(ctx context.Context, service types.Ser
183
183
Status : progress .Done ,
184
184
Text : "Pulled" ,
185
185
})
186
- return nil
186
+
187
+ inspected , _ , err := s .dockerCli .Client ().ImageInspectWithRaw (ctx , service .Image )
188
+ if err != nil {
189
+ return "" , err
190
+ }
191
+ return inspected .ID , nil
187
192
}
188
193
189
194
func (s * composeService ) pullRequiredImages (ctx context.Context , project * types.Project , images map [string ]string , quietPull bool ) error {
@@ -220,18 +225,29 @@ func (s *composeService) pullRequiredImages(ctx context.Context, project *types.
220
225
return progress .Run (ctx , func (ctx context.Context ) error {
221
226
w := progress .ContextWriter (ctx )
222
227
eg , ctx := errgroup .WithContext (ctx )
223
- for _ , service := range needPull {
224
- service := service
228
+ pulledImages := make ([]string , len (needPull ))
229
+ for i , service := range needPull {
230
+ i , service := i , service
225
231
eg .Go (func () error {
226
- err := s .pullServiceImage (ctx , service , info , s .configFile (), w , quietPull )
232
+ id , err := s .pullServiceImage (ctx , service , info , s .configFile (), w , quietPull )
233
+ pulledImages [i ] = id
227
234
if err != nil && service .Build != nil {
228
235
// image can be built, so we can ignore pull failure
229
236
return nil
230
237
}
231
238
return err
232
239
})
233
240
}
234
- return eg .Wait ()
241
+ for i , service := range needPull {
242
+ if pulledImages [i ] != "" {
243
+ images [service .Image ] = pulledImages [i ]
244
+ }
245
+ }
246
+ err := eg .Wait ()
247
+ if err != nil {
248
+ return err
249
+ }
250
+ return err
235
251
})
236
252
}
237
253
0 commit comments