You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Testcontainers通信异常:容器间连接被拒绝问题求助

解决Testcontainers中容器间无法连接S3Mock的问题

问题场景

你配置了两个同属一个Docker网络的Testcontainers容器:

  • 第一个GenericContainer配置:
    genericContainer
        .withImagePullPolicy(PullPolicy.alwaysPull())
        .withExposedPorts(SPRING_BOOT_PORT)
        .withNetwork(NETWORK)
        .withAccessToHost(true);
    
    该容器启动正常且可被ping通。
  • 第二个S3Mock容器配置:
    S3MockContainer(DockerImageName.parse("adobe/s3mock:2.4.13"))
        .withInitialBuckets(S3_BUCKET_NAME)
        .withNetwork(NETWORK);
    
    无法从第一个容器内连接或ping通该S3Mock容器,使用s3MockContainer.getHost() + getFirstMappedPort()的方式也无法建立连接。

解决方案

容器间在同一Docker网络内的访问逻辑与宿主机访问不同,不能依赖宿主机映射端口,需按以下步骤调整:

1. 给S3Mock容器设置网络别名

在S3Mock容器配置中添加固定网络别名,让同网络内的其他容器可以通过别名直接访问:

S3MockContainer s3MockContainer = new S3MockContainer(DockerImageName.parse("adobe/s3mock:2.4.13"))
        .withInitialBuckets(S3_BUCKET_NAME)
        .withNetwork(NETWORK)
        .withNetworkAliases("s3mock"); // 添加网络别名,作为容器间访问的主机名

2. 使用S3Mock容器内部端口访问

adobe/s3mock:2.4.13版本的内部默认端口为:

  • HTTP:9090
  • HTTPS:9191

第一个容器内的S3客户端需配置端点为http://s3mock:9090(或HTTPS的https://s3mock:9191),而非宿主机的映射端口。以AWS SDK为例:

AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
        .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://s3mock:9090", "us-east-1"))
        .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("test", "test")))
        .enablePathStyleAccess() // S3Mock必须启用路径样式访问
        .build();

3. 关键逻辑说明

  • getHost()返回宿主机IP、getFirstMappedPort()返回宿主机映射端口,这两个参数仅适用于宿主机访问容器的场景。
  • 同一Docker网络内的容器属于内网环境,直接通过容器别名/容器名+内部端口即可互通,无需经过宿主机端口映射。
  • S3Mock镜像已默认暴露内部端口,无需额外配置withExposedPorts。

内容的提问来源于stack exchange,提问作者user1555190

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:30:21