From d37d48309748520d057dfbb28274b22d9dc9f07c Mon Sep 17 00:00:00 2001 From: Justin Chadwell Date: Thu, 10 Aug 2023 14:29:36 +0100 Subject: [PATCH] docker-container: avoid fail if container conflict Fixes the race condition where two boots are executed simultaneously across multiple processes. We initially check to see if the container exists, but if during container creation we get a name conflict, we don't treat this error as a hard failure, and instead move immediately into waiting for the node to boot. Signed-off-by: Justin Chadwell --- driver/docker-container/driver.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/driver/docker-container/driver.go b/driver/docker-container/driver.go index e06380bf12c..d42d233a94f 100644 --- a/driver/docker-container/driver.go +++ b/driver/docker-container/driver.go @@ -22,6 +22,7 @@ import ( "github.com/docker/docker/api/types/mount" "github.com/docker/docker/api/types/network" dockerclient "github.com/docker/docker/client" + "github.com/docker/docker/errdefs" dockerarchive "github.com/docker/docker/pkg/archive" "github.com/docker/docker/pkg/idtools" "github.com/docker/docker/pkg/stdcopy" @@ -148,14 +149,16 @@ func (d *Driver) create(ctx context.Context, l progress.SubLogger) error { } _, err := d.DockerAPI.ContainerCreate(ctx, cfg, hc, &network.NetworkingConfig{}, nil, d.Name) - if err != nil { - return err - } - if err := d.copyToContainer(ctx, d.InitConfig.Files); err != nil { + if err != nil && !errdefs.IsConflict(err) { return err } - if err := d.start(ctx, l); err != nil { - return err + if err == nil { + if err := d.copyToContainer(ctx, d.InitConfig.Files); err != nil { + return err + } + if err := d.start(ctx, l); err != nil { + return err + } } if err := d.wait(ctx, l); err != nil { return err