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
相关产品推荐
相关产品推荐

