11package docker
22
33import (
4+ "context"
45 "fmt"
56 "strings"
67
8+ "github.com/docker/docker/api/types/container"
79 "github.com/google/uuid"
10+ "github.com/pkg/errors"
811 "github.com/rs/zerolog"
912 tc "github.com/testcontainers/testcontainers-go"
1013
@@ -58,8 +61,13 @@ var NaiveRetrier = func(l zerolog.Logger, startErr error, req tc.GenericContaine
5861 Str ("Retrier" , "NaiveRetrier" ).
5962 Msgf ("Attempting to start %s container" , req .Name )
6063
61- oldName := req .Name
62- req .Name = req .Name + "-naive-retry"
64+ req .Reuse = false // We need to force a new container to be created
65+
66+ removeErr := removeContainer (req )
67+ if removeErr != nil {
68+ l .Error ().Err (removeErr ).Msgf ("Failed to remove %s container to initiate restart" , req .Name )
69+ return nil , removeErr
70+ }
6371
6472 ct , err := tc .GenericContainer (testcontext .Get (nil ), req )
6573 if err == nil {
@@ -78,8 +86,6 @@ var NaiveRetrier = func(l zerolog.Logger, startErr error, req tc.GenericContaine
7886 }
7987 }
8088
81- req .Name = oldName
82-
8389 l .Debug ().
8490 Str ("Original start error" , startErr .Error ()).
8591 Str ("Current start error" , err .Error ()).
@@ -94,9 +100,8 @@ var LinuxPlatformImageRetrier = func(l zerolog.Logger, startErr error, req tc.Ge
94100 if startErr == nil {
95101 return nil , startErr
96102 }
103+
97104 req .Reuse = false // We need to force a new container to be created
98- oldName := req .Name
99- req .Name = req .Name + "-linux-retry"
100105
101106 // a bit lame, but that's the lame error we get in case there's no specific image for our platform :facepalm:
102107 if ! strings .Contains (startErr .Error (), "No such image" ) {
@@ -115,6 +120,12 @@ var LinuxPlatformImageRetrier = func(l zerolog.Logger, startErr error, req tc.Ge
115120 originalPlatform := req .ImagePlatform
116121 req .ImagePlatform = "linux/x86_64"
117122
123+ removeErr := removeContainer (req )
124+ if removeErr != nil {
125+ l .Error ().Err (removeErr ).Msgf ("Failed to remove %s container to initiate restart" , req .Name )
126+ return nil , removeErr
127+ }
128+
118129 ct , err := tc .GenericContainer (testcontext .Get (nil ), req )
119130 if err == nil {
120131 l .Debug ().
@@ -124,7 +135,6 @@ var LinuxPlatformImageRetrier = func(l zerolog.Logger, startErr error, req tc.Ge
124135 }
125136
126137 req .ImagePlatform = originalPlatform
127- req .Name = oldName
128138
129139 if ct != nil {
130140 err := ct .Terminate (testcontext .Get (nil ))
@@ -171,3 +181,18 @@ func StartContainerWithRetry(l zerolog.Logger, req tc.GenericContainerRequest, r
171181
172182 return nil , err
173183}
184+
185+ func removeContainer (req tc.GenericContainerRequest ) error {
186+ provider , providerErr := tc .NewDockerProvider ()
187+ if providerErr != nil {
188+ return errors .Wrapf (providerErr , "failed to create Docker provider" )
189+ }
190+
191+ removeErr := provider .Client ().ContainerRemove (context .Background (), req .Name , container.RemoveOptions {Force : true })
192+ if removeErr != nil && strings .Contains (strings .ToLower (removeErr .Error ()), "no such container" ) {
193+ // container doesn't exist, nothing to remove
194+ return nil
195+ }
196+
197+ return removeErr
198+ }
0 commit comments