Skip to content

Commit bfeb1dc

Browse files
lrascaondeloof
authored andcommitted
Fix concurrent map read/write when recreating containers
Signed-off-by: Luis Rascao <[email protected]>
1 parent 9ec4397 commit bfeb1dc

File tree

2 files changed

+37
-18
lines changed

2 files changed

+37
-18
lines changed

pkg/compose/convergence.go

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,8 @@ func (s *composeService) createContainer(ctx context.Context, project *types.Pro
399399
w := progress.ContextWriter(ctx)
400400
eventName := "Container " + name
401401
w.Event(progress.CreatingEvent(eventName))
402-
container, err = s.createMobyContainer(ctx, project, service, name, number, nil, autoRemove, useNetworkAliases, attachStdin, w)
402+
container, err = s.createMobyContainer(ctx, project, service, name, number, nil,
403+
autoRemove, useNetworkAliases, attachStdin, w, mergeLabels(service.Labels, service.CustomLabels))
403404
if err != nil {
404405
return
405406
}
@@ -424,8 +425,9 @@ func (s *composeService) recreateContainer(ctx context.Context, project *types.P
424425
}
425426
name := getContainerName(project.Name, service, number)
426427
tmpName := fmt.Sprintf("%s_%s", replaced.ID[:12], name)
427-
service.CustomLabels[api.ContainerReplaceLabel] = replaced.ID
428-
created, err = s.createMobyContainer(ctx, project, service, tmpName, number, inherited, false, true, false, w)
428+
created, err = s.createMobyContainer(ctx, project, service, tmpName, number, inherited,
429+
false, true, false, w,
430+
mergeLabels(service.Labels, service.CustomLabels).Add(api.ContainerReplaceLabel, replaced.ID))
429431
if err != nil {
430432
return created, err
431433
}
@@ -475,10 +477,19 @@ func (s *composeService) startContainer(ctx context.Context, container moby.Cont
475477
return nil
476478
}
477479

478-
func (s *composeService) createMobyContainer(ctx context.Context, project *types.Project, service types.ServiceConfig,
479-
name string, number int, inherit *moby.Container, autoRemove bool, useNetworkAliases bool, attachStdin bool, w progress.Writer) (moby.Container, error) {
480+
func (s *composeService) createMobyContainer(ctx context.Context,
481+
project *types.Project,
482+
service types.ServiceConfig,
483+
name string,
484+
number int,
485+
inherit *moby.Container,
486+
autoRemove, useNetworkAliases, attachStdin bool,
487+
w progress.Writer,
488+
labels types.Labels,
489+
) (moby.Container, error) {
480490
var created moby.Container
481-
containerConfig, hostConfig, networkingConfig, err := s.getCreateOptions(ctx, project, service, number, inherit, autoRemove, attachStdin)
491+
containerConfig, hostConfig, networkingConfig, err := s.getCreateOptions(ctx, project, service, number, inherit,
492+
autoRemove, attachStdin, labels)
482493
if err != nil {
483494
return created, err
484495
}
@@ -725,3 +736,13 @@ func (s *composeService) startService(ctx context.Context, project *types.Projec
725736
}
726737
return nil
727738
}
739+
740+
func mergeLabels(ls ...types.Labels) types.Labels {
741+
merged := types.Labels{}
742+
for _, l := range ls {
743+
for k, v := range l {
744+
merged[k] = v
745+
}
746+
}
747+
return merged
748+
}

pkg/compose/create.go

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -236,10 +236,16 @@ func (s *composeService) ensureProjectVolumes(ctx context.Context, project *type
236236
return nil
237237
}
238238

239-
func (s *composeService) getCreateOptions(ctx context.Context, p *types.Project, service types.ServiceConfig,
240-
number int, inherit *moby.Container, autoRemove bool, attachStdin bool) (*container.Config, *container.HostConfig, *network.NetworkingConfig, error) {
239+
func (s *composeService) getCreateOptions(ctx context.Context,
240+
p *types.Project,
241+
service types.ServiceConfig,
242+
number int,
243+
inherit *moby.Container,
244+
autoRemove, attachStdin bool,
245+
labels types.Labels,
246+
) (*container.Config, *container.HostConfig, *network.NetworkingConfig, error) {
241247

242-
labels, err := s.prepareLabels(service, number)
248+
labels, err := s.prepareLabels(labels, service, number)
243249
if err != nil {
244250
return nil, nil, nil, err
245251
}
@@ -451,15 +457,7 @@ func parseSecurityOpts(p *types.Project, securityOpts []string) ([]string, bool,
451457
return parsed, unconfined, nil
452458
}
453459

454-
func (s *composeService) prepareLabels(service types.ServiceConfig, number int) (map[string]string, error) {
455-
labels := map[string]string{}
456-
for k, v := range service.Labels {
457-
labels[k] = v
458-
}
459-
for k, v := range service.CustomLabels {
460-
labels[k] = v
461-
}
462-
460+
func (s *composeService) prepareLabels(labels types.Labels, service types.ServiceConfig, number int) (map[string]string, error) {
463461
hash, err := ServiceHash(service)
464462
if err != nil {
465463
return nil, err

0 commit comments

Comments
 (0)