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

使用TestContainers .NET连接串,Docker容器无法连接Azurite

问题原因

你拿到的Azurite连接串指向主机的127.0.0.1和随机映射端口,但Function App容器里的127.0.0.1是容器自己的回环地址,不是你的物理主机。容器内部尝试访问自己的对应端口,自然会出现连接拒绝的错误。

简洁解决方案

方式1:用TestContainers自定义网络自动生成内部连接串

TestContainers for .NET原生支持多容器同网络通信,还能自动生成适配网络的连接串,不用手动替换:

  1. 创建自定义Docker网络:
    var network = new NetworkBuilder().Build();
    
  2. 启动Azurite时加入该网络并设置别名:
    var azuriteContainer = new AzuriteBuilder()
        .WithNetwork(network)
        .WithNetworkAliases("azurite")
        .Build();
    await azuriteContainer.StartAsync();
    
  3. 启动Function App容器时同样加入该网络,然后获取Azurite在网络内的连接串:
    // 自动生成基于自定义网络的连接串,用别名和Azurite内部端口
    var azuriteInternalConnString = azuriteContainer.GetConnectionString(network);
    
    var functionContainer = new ContainerBuilder()
        .WithImage("你的Function App镜像")
        .WithNetwork(network)
        .WithEnvironment("AzureWebJobsStorage", azuriteInternalConnString)
        .Build();
    await functionContainer.StartAsync();
    

这种方式完全不需要手动修改连接串,TestContainers会自动处理网络内的地址映射。

方式2:替换连接串中的主机地址(备选)

如果不想用自定义网络,可以把连接串里的127.0.0.1换成Docker能识别的主机内部IP:

// 获取Docker环境下的主机内部IP
var hostInternalIp = TestcontainersSettings.OS.DockerHostIpAddress;
var originalConnString = azuriteContainer.GetConnectionString();
var updatedConnString = originalConnString.Replace("127.0.0.1", hostInternalIp);

把更新后的连接串传给Function App的AzureWebJobsStorage环境变量即可。不过这种方式依赖Docker的主机IP配置,不如自定义网络稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 09:20:00