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

Testcontainers容器间通信问题:Spring Boot连接DynamoDB失败

解决方案:Testcontainers中Spring Boot容器连接DynamoDB的动态端口问题

问题核心

你遇到的连接拒绝问题,根源是Spring Boot容器内的localhost指向容器自身,而非DynamoDB容器。你之前传递宿主机的动态端口给Spring Boot容器,容器内尝试访问localhost:xxx时,实际是在访问自身的端口,自然会被拒绝。

修正方案

1. 用容器网络别名+内部固定端口通信

在同一个Testcontainers网络中,容器可以通过网络别名直接互相访问,无需依赖宿主机的动态端口映射。DynamoDB容器内部固定监听8000端口,因此Spring Boot容器只需通过http://dynoDBContainer:8000即可访问。

2. 移除冗余配置

withNetworkMode(network.getId())是冗余配置,withNetwork(network)已经指定了容器所属网络,无需重复设置。

3. 修正后的代码示例

// 定义共享网络
public static final Network network = Network.newNetwork();

public static final GenericContainer dynamoDBLocal = new GenericContainer("amazon/dynamodb-local:latest")
        .withImagePullPolicy(PullPolicy.defaultPolicy())
        .withNetwork(network)
        .withNetworkAliases("dynoDBContainer")
        .withExposedPorts(8000);

public static final GenericContainer appContainer = new GenericContainer(APP_IMAGE_FUTURE)
        .withImagePullPolicy(PullPolicy.defaultPolicy())
        .withExposedPorts(8080)
        .withNetwork(network)
        .waitingFor(Wait.forHttp("/login").forStatusCode(200))
        .dependsOn(dynamoDBLocal)
        // 传递正确的DynamoDB访问地址:网络别名+内部固定端口
        .withEnv("DYNAMODB_ENDPOINT", "http://dynoDBContainer:8000");

关键说明

  • 动态端口是Testcontainers映射到宿主机的端口,仅用于宿主机访问容器服务,容器之间通信不需要用这个端口。
  • 确保Spring Boot应用读取DYNAMODB_ENDPOINT环境变量,并将其配置为DynamoDB的连接地址,而不是硬编码的localhost:8000。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:55:19