Docker Compose环境下Azure Function容器间调用失败问题咨询
问题根源
你的问题核心在于:Azure Function App容器内部并没有监听80端口,而是使用了launchSettings.json中指定的31744端口。容器间通信是直接访问容器内部的端口,而非主机映射的端口,因此用服务名http://functionapp2/api/Function2访问时,会尝试连接容器的80端口,但此时Function App并未在该端口监听,导致连接被拒绝。而通过http://functionapp2:31744/api/Function2能成功,是因为这个端口是容器内部服务实际监听的端口(由launchSettings指定)。
修复步骤
1. 让Function App容器内部监听80端口
在docker-compose.override.yml的functionapp2服务中添加环境变量,强制Function App在容器内的80端口启动:
services: functionapp2: environment: - ASPNETCORE_ENVIRONMENT=Development - FUNCTIONS_CUSTOMHANDLER_PORT=80 # 关键配置:指定自定义handler监听80端口 - ASPNETCORE_URLS=http://+:80 # 确保.NET运行时监听80端口
注:.NET 6的Azure Function App使用自定义handler模式,必须通过
FUNCTIONS_CUSTOMHANDLER_PORT指定监听端口,否则会随机或使用launchSettings中的端口。
2. 调整主机端口映射(可选,用于外部访问)
如果需要从主机访问Function App,可在functionapp2的ports配置中添加映射,确保主机端口未被占用:
services: functionapp2: # ... 其他配置 ports: - "31744:80" # 主机端口31744映射到容器80端口
若之前报“端口已被占用”,可通过
netstat -ano | findstr :31744(Windows)或lsof -i :31744(Linux/macOS)检查端口占用情况,更换未被占用的端口即可。
3. 移除launchSettings.json中的冲突配置
修改FunctionApp2的launchSettings.json,删除httpPort配置,避免和容器内端口冲突:
"Docker": { "commandName": "Docker", "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}", "useSSL": false }
4. 重新启动容器编排
在Visual Studio中重新生成并启动Docker Compose,或执行以下命令:
docker-compose down docker-compose up --build
验证结果
完成配置后:
- ✅ Web API可通过
http://functionapp2/api/Function2正常调用Azure Function App - ✅ 外部仍可通过
http://localhost:31744/api/Function2访问Function App - ✅ Function App调用Web API的逻辑保持正常
内容的提问来源于stack exchange,提问作者Kim

