Skip to content

Commit dc6097d

Browse files
authored
Merge pull request docker#9261 from ndeloof/recreate_on_image_updated
recreate container after image has been rebuilt/pulled
2 parents 4d163f3 + 85a4d04 commit dc6097d

File tree

3 files changed

+28
-9
lines changed

3 files changed

+28
-9
lines changed

pkg/compose/build.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,15 @@ func (s *composeService) getLocalImagesDigests(ctx context.Context, project *typ
188188
for name, info := range imgs {
189189
images[name] = info.ID
190190
}
191+
192+
for _, s := range project.Services {
193+
imgName := getImageName(s, project.Name)
194+
digest, ok := images[imgName]
195+
if ok {
196+
s.CustomLabels[api.ImageDigestLabel] = digest
197+
}
198+
}
199+
191200
return images, nil
192201
}
193202

pkg/compose/convergence.go

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -189,17 +189,11 @@ func (c *convergence) ensureService(ctx context.Context, project *types.Project,
189189
continue
190190
}
191191

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)
197193
if err != nil {
198194
return err
199195
}
200-
name := getContainerProgressName(container)
201-
diverged := container.Labels[api.ConfigHashLabel] != configHash
202-
if diverged || recreate == api.RecreateForce || service.Extensions[extLifecycle] == forceRecreate {
196+
if mustRecreate {
203197
i, container := i, container
204198
eg.Go(func() error {
205199
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,
211205

212206
// Enforce non-diverged containers are running
213207
w := progress.ContextWriter(ctx)
208+
name := getContainerProgressName(container)
214209
switch container.State {
215210
case ContainerRunning:
216211
w.Event(progress.RunningEvent(name))
@@ -249,6 +244,22 @@ func (c *convergence) ensureService(ctx context.Context, project *types.Project,
249244
return err
250245
}
251246

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+
252263
func getContainerName(projectName string, service types.ServiceConfig, number int) string {
253264
name := strings.Join([]string{projectName, service.Name, strconv.Itoa(number)}, Separator)
254265
if service.ContainerName != "" {

pkg/compose/images.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ func (s *composeService) getImages(ctx context.Context, images []string) (map[st
9393
tag := ""
9494
repository := ""
9595
if len(inspect.RepoTags) > 0 {
96-
9796
repotag := strings.Split(inspect.RepoTags[0], ":")
9897
repository = repotag[0]
9998
if len(repotag) > 1 {

0 commit comments

Comments
 (0)