Currently the following different test configurations produce the same ContainerConnectionSource which means that Spring incorrectly caches the application context.

@Container
@ServiceConnection
@Ssl
static final ElasticsearchContainer elasticSearch = new ElasticsearchContainer(TestImage.ELASTICSEARCH_9.toString())
        .withPassword("my-custom-password");
@Container
@ServiceConnection
@Ssl
static final ElasticsearchContainer elasticSearch = new ElasticsearchContainer(TestImage.ELASTICSEARCH_9.toString());

This can result in connections errors such as:

at co.elastic.clients.transport.ElasticsearchTransportBase.getApiResponse(ElasticsearchTransportBase.java:357)  
    at co.elastic.clients.transport.ElasticsearchTransportBase.performRequest(ElasticsearchTransportBase.java:154)  
    at co.elastic.clients.elasticsearch.indices.ElasticsearchIndicesClient.exists(ElasticsearchIndicesClient.java:1148) 
    at org.springframework.data.elasticsearch.client.elc.IndicesTemplate.lambda$doExists$0(IndicesTemplate.java:180)    
    at org.springframework.data.elasticsearch.client.elc.ChildTemplate.execute(ChildTemplate.java:71)   
    at org.springframework.data.elasticsearch.client.elc.IndicesTemplate.doExists(IndicesTemplate.java:180) 
    at org.springframework.data.elasticsearch.client.elc.IndicesTemplate.exists(IndicesTemplate.java:172)   
    at org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository.createIndexAndMappingIfNeeded(SimpleElasticsearchRepository.java:93) 
    at org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository.<init>(SimpleElasticsearchRepository.java:87)    
    at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)    
    at java.lang.reflect.Constructor.newInstance(Constructor.java:483)  
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:209) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.instantiateClass(RepositoryFactorySupport.java:641)    
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getTargetRepositoryViaReflection(RepositoryFactorySupport.java:614)    
    at org.springframework.data.elasticsearch.repository.support.ElasticsearchRepositoryFactory.getTargetRepository(ElasticsearchRepositoryFactory.java:81) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:363)   
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$1(RepositoryFactoryBeanSupport.java:351) 
    at org.springframework.data.util.Lazy.getNullable(Lazy.java:136)    
    at org.springframework.data.util.Lazy.get(Lazy.java:114)    
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:360)  
    at org.springframework.data.elasticsearch.repository.support.ElasticsearchRepositoryFactoryBean.afterPropertiesSet(ElasticsearchRepositoryFactoryBean.java:69)  
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1865) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1814)    
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)   
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333)   
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371)   
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331)    
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)  
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1200)  
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1172)   
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1109)  
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:979)  
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:619)  
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)   
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:441)    
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)   
    at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$2(SpringBootContextLoader.java:148) 
    at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) 
    at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) 
    at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) 
    at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:573)    
    at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:148)  
    at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:114)  
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:247)   
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.lambda$loadContext$0(DefaultCacheAwareContextLoaderDelegate.java:167)  
    at org.springframework.test.context.cache.DefaultContextCache.put(DefaultContextCache.java:172) 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:160)   
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:128)   
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:155)  
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:111) 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) 
    at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:159) 
    at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:186)  
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215)    
    at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:197)    
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215)    
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1716)   
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570)    
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560) 
    at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:153)    
    at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:176)  
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265)    
    at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:636)   
    at java.util.Optional.orElseGet(Optional.java:364)  
    at java.util.ArrayList.forEach(ArrayList.java:1604) 
    at java.util.ArrayList.forEach(ArrayList.java:1604)

Comment From: philwebb

Actually, this analysis seems wrong because ServiceConnectionContextCustomizer.CacheKey includes the container.