容器中Durable Function无法连接本地ServiceBus模拟器求助
问题解决步骤
一、必须让Function容器与模拟器容器处于同一Docker网络
容器默认彼此隔离,只有在同一网络下才能通过容器名称互相访问,这是触发HostNotFound错误的核心原因。操作步骤如下:
查看模拟器的Docker网络名称
打开模拟器的docker-compose-default.yml,找到networks节点:- 如果有自定义网络(比如
servicebus-emulator-net),记下该名称; - 如果没有显式定义网络,docker-compose会自动生成一个以项目文件夹名为前缀的网络,可通过
docker network ls命令查看,格式类似项目文件夹名_default。
- 如果有自定义网络(比如
将Function容器加入该网络
- 若用
docker run启动Function容器,添加--network参数:docker run --network <模拟器网络名称> -e AzureServiceBusConnection="..." <你的Function镜像> - 若用docker-compose管理Function,在Function的
docker-compose.yml中添加对应网络配置:networks: default: external: name: <模拟器网络名称>
- 若用
验证网络连通性
进入Function容器,ping模拟器的容器名称(比如你连接字符串里的sb-emulator),确认能正常连通:docker exec -it <Function容器ID> ping sb-emulator
二、修正容器中Function的ServiceBus连接配置
你的环境变量存在冗余和配置错误,正确配置如下:
删除无效环境变量
移除以下两个无效配置项:-e AzureServiceBusConnection__fullyQualifiedNamespace="sbemulatorns" -e ServiceBus="Endpoint=sb://sb-emulator;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;"设置正确的
AzureServiceBusConnection环境变量
直接将完整连接字符串赋值给AzureServiceBusConnection,注意使用模拟器容器名称(如sb-emulator)而非localhost,端口保持5672:-e AzureServiceBusConnection="Endpoint=sb://sb-emulator:5672;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;"该变量需与Trigger配置的
Connection = "AzureServiceBusConnection"完全对应。保留实体名称相关配置
保留以下与队列、主题、订阅名称对应的环境变量:-e ServiceBusSubscription="subscription.1" -e ServiceBusTopic="sb-topic-dev" -e ServiceBusIncomingQueue="queue-local4-dev"
三、额外检查项
- 确认模拟器容器已暴露5672端口:在模拟器的
docker-compose-default.yml中,需包含类似ports: - "5672:5672"的端口映射配置。 - 核对SAS密钥:确保连接字符串中的
SAS_KEY_VALUE与模拟器Config.json里SharedAccessKeys下的密钥完全一致。 - 确认实体名称匹配:检查Config.json中的队列、主题、订阅名称,与Function环境变量值完全一致(名称大小写不敏感,但建议保持统一)。
内容的提问来源于stack exchange,提问作者Reinder Wit
相关产品推荐
相关产品推荐

