@@ -189,17 +189,11 @@ func (c *convergence) ensureService(ctx context.Context, project *types.Project,
189
189
continue
190
190
}
191
191
192
- if recreate == api .RecreateNever {
193
- continue
194
- }
195
- // Re-create diverged containers
196
- configHash , err := ServiceHash (service )
192
+ mustRecreate , err := mustRecreate (service , container , recreate )
197
193
if err != nil {
198
194
return err
199
195
}
200
- name := getContainerProgressName (container )
201
- diverged := container .Labels [api .ConfigHashLabel ] != configHash
202
- if diverged || recreate == api .RecreateForce || service .Extensions [extLifecycle ] == forceRecreate {
196
+ if mustRecreate {
203
197
i , container := i , container
204
198
eg .Go (func () error {
205
199
recreated , err := c .service .recreateContainer (ctx , project , service , container , inherit , timeout )
@@ -211,6 +205,7 @@ func (c *convergence) ensureService(ctx context.Context, project *types.Project,
211
205
212
206
// Enforce non-diverged containers are running
213
207
w := progress .ContextWriter (ctx )
208
+ name := getContainerProgressName (container )
214
209
switch container .State {
215
210
case ContainerRunning :
216
211
w .Event (progress .RunningEvent (name ))
@@ -249,6 +244,22 @@ func (c *convergence) ensureService(ctx context.Context, project *types.Project,
249
244
return err
250
245
}
251
246
247
+ func mustRecreate (expected types.ServiceConfig , actual moby.Container , policy string ) (bool , error ) {
248
+ if policy == api .RecreateNever {
249
+ return false , nil
250
+ }
251
+ if policy == api .RecreateForce || expected .Extensions [extLifecycle ] == forceRecreate {
252
+ return true , nil
253
+ }
254
+ configHash , err := ServiceHash (expected )
255
+ if err != nil {
256
+ return false , err
257
+ }
258
+ configChanged := actual .Labels [api .ConfigHashLabel ] != configHash
259
+ imageUpdated := actual .Labels [api .ImageDigestLabel ] != expected .CustomLabels [api .ImageDigestLabel ]
260
+ return configChanged || imageUpdated , nil
261
+ }
262
+
252
263
func getContainerName (projectName string , service types.ServiceConfig , number int ) string {
253
264
name := strings .Join ([]string {projectName , service .Name , strconv .Itoa (number )}, Separator )
254
265
if service .ContainerName != "" {
0 commit comments