@@ -19,18 +19,21 @@ use std::path::PathBuf;
1919use std:: time:: Duration ;
2020use std:: time:: Instant ;
2121
22+ use bollard:: container:: RemoveContainerOptions ;
2223use bollard:: Docker ;
2324use clap:: Parser ;
2425use redis:: Commands ;
2526use serde:: Deserialize ;
2627use serde:: Serialize ;
2728use serde_json:: Value ;
29+ use testcontainers:: core:: error:: WaitContainerError ;
2830use testcontainers:: core:: IntoContainerPort ;
2931use testcontainers:: core:: WaitFor ;
3032use testcontainers:: runners:: AsyncRunner ;
3133use testcontainers:: ContainerAsync ;
3234use testcontainers:: GenericImage ;
3335use testcontainers:: ImageExt ;
36+ use testcontainers:: TestcontainersError ;
3437use testcontainers_modules:: mysql:: Mysql ;
3538use testcontainers_modules:: redis:: Redis ;
3639use testcontainers_modules:: redis:: REDIS_PORT ;
@@ -256,9 +259,7 @@ pub async fn run_ttc_container(
256259 let start = Instant :: now ( ) ;
257260 println ! ( "Start container {container_name}" ) ;
258261
259- // Stop the container
260- let _ = docker. stop_container ( & container_name, None ) . await ;
261- let _ = docker. remove_container ( & container_name, None ) . await ;
262+ stop_container ( docker, & container_name) . await ;
262263
263264 let mut i = 1 ;
264265 loop {
@@ -290,6 +291,10 @@ pub async fn run_ttc_container(
290291 "Start container {} using {} secs failed: {}" ,
291292 container_name, duration, err
292293 ) ;
294+ if let TestcontainersError :: WaitContainer ( WaitContainerError :: StartupTimeout ) = err
295+ {
296+ stop_container ( docker, & container_name) . await ;
297+ }
293298 if i == CONTAINER_RETRY_TIMES || duration >= CONTAINER_TIMEOUT_SECONDS {
294299 break ;
295300 } else {
@@ -327,9 +332,7 @@ async fn run_redis_server(docker: &Docker) -> Result<ContainerAsync<Redis>> {
327332 let container_name = "redis" . to_string ( ) ;
328333 println ! ( "Start container {container_name}" ) ;
329334
330- // Stop the container
331- let _ = docker. stop_container ( & container_name, None ) . await ;
332- let _ = docker. remove_container ( & container_name, None ) . await ;
335+ stop_container ( docker, & container_name) . await ;
333336
334337 let mut i = 1 ;
335338 loop {
@@ -365,6 +368,10 @@ async fn run_redis_server(docker: &Docker) -> Result<ContainerAsync<Redis>> {
365368 "Start container {} using {} secs failed: {}" ,
366369 container_name, duration, err
367370 ) ;
371+ if let TestcontainersError :: WaitContainer ( WaitContainerError :: StartupTimeout ) = err
372+ {
373+ stop_container ( docker, & container_name) . await ;
374+ }
368375 if i == CONTAINER_RETRY_TIMES || duration >= CONTAINER_TIMEOUT_SECONDS {
369376 break ;
370377 } else {
@@ -381,9 +388,7 @@ async fn run_mysql_server(docker: &Docker) -> Result<ContainerAsync<Mysql>> {
381388 let container_name = "mysql" . to_string ( ) ;
382389 println ! ( "Start container {container_name}" ) ;
383390
384- // Stop the container
385- let _ = docker. stop_container ( & container_name, None ) . await ;
386- let _ = docker. remove_container ( & container_name, None ) . await ;
391+ stop_container ( docker, & container_name) . await ;
387392
388393 // Add a table for test.
389394 // CREATE TABLE test.user(
@@ -436,6 +441,10 @@ async fn run_mysql_server(docker: &Docker) -> Result<ContainerAsync<Mysql>> {
436441 "Start container {} using {} secs failed: {}" ,
437442 container_name, duration, err
438443 ) ;
444+ if let TestcontainersError :: WaitContainer ( WaitContainerError :: StartupTimeout ) = err
445+ {
446+ stop_container ( docker, & container_name) . await ;
447+ }
439448 if i == CONTAINER_RETRY_TIMES || duration >= CONTAINER_TIMEOUT_SECONDS {
440449 break ;
441450 } else {
@@ -446,3 +455,14 @@ async fn run_mysql_server(docker: &Docker) -> Result<ContainerAsync<Mysql>> {
446455 }
447456 Err ( format ! ( "Start {container_name} failed" ) . into ( ) )
448457}
458+
459+ // Stop the running container to avoid conflict
460+ async fn stop_container ( docker : & Docker , container_name : & str ) {
461+ let _ = docker. stop_container ( container_name, None ) . await ;
462+ let options = Some ( RemoveContainerOptions {
463+ force : true ,
464+ ..Default :: default ( )
465+ } ) ;
466+ let _ = docker. remove_container ( container_name, options) . await ;
467+ println ! ( "Stop container {container_name}" ) ;
468+ }
0 commit comments