Azure Function容器部署端口不匹配启动超时问题排查
检查Function运行时的端口配置优先级
Azure Functions运行时优先读取FUNCTIONS_CUSTOMHANDLER_PORT环境变量,而非PORT或WEBSITES_PORT。如果你的C#函数使用了自定义处理器,或者运行时默认绑定了这个变量,会直接覆盖Dockerfile的暴露端口。直接在应用配置里添加FUNCTIONS_CUSTOMHANDLER_PORT=8080,强制指定监听端口。核对Dockerfile的启动命令
检查Dockerfile里的CMD或ENTRYPOINT是否硬编码了8181端口,比如有没有dotnet run --urls=http://*:8181这类命令。如果有,直接改成http://*:8080,或者用环境变量动态替换:http://*:${PORT:-8080},这样能兼容后续配置的环境变量。排查应用服务计划的端口冲突
同一服务计划下多容器可能出现端口泄漏或未释放的情况,导致Azure误分配端口。可以尝试:- 重启整个应用服务计划,强制释放所有占用的端口
- 给每个函数应用配置唯一的
WEBSITES_PORT,避免同计划内端口冲突 - 查看容器日志的端口绑定详情,确认函数运行时实际监听的端口,别只看
docker run的参数
确认环境变量生效顺序
Azure App Service的环境变量优先级是:应用配置 > Dockerfile的ENV> 镜像默认值。如果Dockerfile里写了ENV PORT=8181,那你在应用配置里设的PORT=8080会被覆盖,得删掉Dockerfile里的硬编码。检查C#代码的端口绑定逻辑
如果是自定义的函数启动逻辑,比如Program.cs里手动写了builder.WebHost.UseUrls("http://*:8181"),那不管环境变量怎么设都会用这个端口。改成读取环境变量:builder.WebHost.UseUrls($"http://*:{Environment.GetEnvironmentVariable("PORT") ?? "8080"}")
内容的提问来源于stack exchange,提问作者user1299379

