在没有Docker Desktop的情况下,使用Docker + WSL启动Azure Event Hubs本地模拟器时遇到的问题
尝试按照 文档 的指引,利用docker compose,在Windows 11上的WSL 2 Ubuntu-24.04发行版中搭建本地Azure Event Hub仿真器。
docker compose文件看起来是这样的:
name: microsoft-azure-eventhubs
services:
emulator:
container_name: "eventhubs-emulator"
image: "mcr.microsoft.com/azure-messaging/eventhubs-emulator:latest"
volumes:
- "/home/user/Config.json:/Eventhubs_Emulator/ConfigFiles/Config.json"
ports:
- "5672:5672"
- "9092:9092"
- "5300:5300"
environment:
BLOB_SERVER: azurite
METADATA_SERVER: azurite
ACCEPT_EULA: Y
depends_on:
- azurite
networks:
eh-emulator:
aliases:
- "eventhubs-emulator"
azurite:
container_name: "azurite"
image: "mcr.microsoft.com/azure-storage/azurite:latest"
ports:
- "10000:10000"
- "10001:10001"
- "10002:10002"
networks:
eh-emulator:
aliases:
- "azurite"
networks:
eh-emulator:
供参考,我们按文档规定使用 Config.json:
{
"UserConfig": {
"NamespaceConfig": [
{
"Type": "EventHub",
"Name": "emulatorNs1",
"Entities": [
{
"Name": "eh1",
"PartitionCount": "2",
"ConsumerGroups": [
{
"Name": "cg1"
}
]
}
]
}
],
"LoggingConfig": {
"Type": "File"
}
}
}
通过 docker compose up -d 启动时,Event Hub容器在几秒后崩溃,日志中输出如下:
eventhubs-emulator | fail: a.E.aEb[0]
eventhubs-emulator | Emulator Start up probe Unsuccessful. MetadataStore Health status: Unhealthy BlobStore Health status: Unhealthy
eventhubs-emulator | fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
eventhubs-emulator | Health check Emulator Health Check with status Unhealthy completed after 20081.4284ms with message 'Emulator Start up probe Unsuccessful. MetadataStore Health status: Unhealthy BlobStore Health status: Unhealthy'
eventhubs-emulator | Retry 1 encountered an exception: Emulator Health Check failed.. Waiting 00:00:00 before next retry.
eventhubs-emulator | fail: a.E.aEb[0]
eventhubs-emulator | Emulator Start up probe Unsuccessful. MetadataStore Health status: Unhealthy BlobStore Health status: Unhealthy
eventhubs-emulator | fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
eventhubs-emulator | Health check Emulator Health Check with status Unhealthy completed after 20004.7113ms with message 'Emulator Start up probe Unsuccessful. MetadataStore Health status: Unhealthy BlobStore Health status: Unhealthy'
eventhubs-emulator | Retry 2 encountered an exception: Emulator Health Check failed.. Waiting 00:00:00 before next retry.
eventhubs-emulator | fail: a.E.aEb[0]
eventhubs-emulator | Emulator Start up probe Unsuccessful. MetadataStore Health status: Unhealthy BlobStore Health status: Unhealthy
eventhubs-emulator | fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
eventhubs-emulator | Health check Emulator Health Check with status Unhealthy completed after 20002.2971ms with message 'Emulator Start up probe Unsuccessful. MetadataStore Health status: Unhealthy BlobStore Health status: Unhealthy'
eventhubs-emulator | An error occurred: Emulator Health Check failed.
看来eventhub容器无法通过 eh-emulator 网络访问azurite(Blob存储仿真器)。
我们尝试了以下操作,但均未成功:
- 在
BLOB_SERVER和METADATA_SERVER中设置azurite容器的IP地址 - 在
BLOB_SERVER和METADATA_SERVER中设置宿主容器的IP地址
可能的原因是什么?
解决方案
在对busybox容器的连通性问题进行排查后:
- 可能成功完成
ping azurite nc -zv azurite 10000成功- ⚠️
wget "http://azurite:10000/"挂起,出现以下消息:Connecting to 172.17.0.1:3128 (172.17.0.1:3128)
原来,代理配置是从主机注入到容器中的, 由于对azurite的连接通过http进行,代理无法将请求从 emulator 容器正确转发到 azurite 容器。
我们通过将http代理的通用环境变量设为空来强制禁用 emulator 内的代理使用:
services:
emulator:
container_name: "eventhubs-emulator"
image: "mcr.microsoft.com/azure-messaging/eventhubs-emulator:latest"
...
environment:
BLOB_SERVER: azurite
METADATA_SERVER: azurite
ACCEPT_EULA: Y
HTTP_PROXY: ''
HTTPS_PROXY: ''
http_proxy: ''
https_proxy: ''
NO_PROXY: ''
no_proxy: ''
...
启动成功产生了以下日志:
eventhubs-emulator | info: a.d.adt[0]
eventhubs-emulator | Emulator Service is Launching On Platform:CBL-Mariner/Linux,X64
eventhubs-emulator | info: a.d.adt[0]
eventhubs-emulator | Instantiating service components
eventhubs-emulator | info: a.d.adt[0]
eventhubs-emulator | Creating namespace, entities and consumer groups
eventhubs-emulator | info: a.E.aEC[0]
eventhubs-emulator | Emulator is launching with config : {"LoggingConfig":{"Type":"File"},"NamespaceConfig":[{"Type":"EventHub","Name":"emulatorns1","Entities":[{"Name":"eh1","PartitionCount":2,"ConsumerGroups":[{"Name":"cg1"},{"Name":"$default"}]}]}]}
eventhubs-emulator | info: a.d.adt[0]
eventhubs-emulator | Emulator Service is Successfully Up! ; Use connection string: "Endpoint=sb://localhost;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;". For more networking-options refer: "https://github.com/Azure/azure-event-hubs-emulator-installer?tab=readme-ov-file#networking-options"
以下是busy box命令,供参考:
docker run -it --rm --network microsoft-azure-eventhubs_eh-emulator busybox sh
请注意,也可能存在其他解决代理配置问题的方式, 例如:
- 将
$NO_PROXY调整为对容器域名加入排除 - 调整代理配置以实现正确的流量转发
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。