Docker部署.NET 8 Web API到AWS App Runner的Kestrel端口绑定问题
解决.NET 8 Web API在AWS App Runner上的Kestrel端口绑定问题
核心问题
AWS App Runner要求应用必须监听8080端口,而你当前的Kestrel配置绑定的是80端口,导致端口不匹配,无法正常接收请求。
解决方案
方案1:通过环境变量动态适配端口(推荐,适配多环境)
这种方式不需要硬编码端口,能自动适配App Runner的环境设置:
- 修改
Program.cs,替换硬编码的端口配置,改为从环境变量读取:
var builder = WebApplication.CreateBuilder(args); // 优先读取App Runner的PORT环境变量,默认 fallback 到8080 var port = Environment.GetEnvironmentVariable("PORT") ?? "8080"; builder.WebHost.UseUrls($"http://0.0.0.0:{port}"); // 以下原有代码保持不变 var app = builder.Build(); app.MapGet("/", () => "Application Started"); app.UseSwagger(); app.UseSwaggerUI(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
- 更新Dockerfile的最终阶段,声明正确的监听端口:
# Stage 3: Runtime - Final Image FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final WORKDIR /app EXPOSE 8080 # 替换原有的EXPOSE 80,或同时保留80作为兼容 COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "MainApi.API.dll"]
- 在AWS App Runner的服务设置中,确认容器端口配置为8080(创建/更新服务时的「服务设置」模块)。
方案2:直接硬编码监听8080端口(适合固定环境)
如果不需要适配其他运行环境,可以直接修改代码和Dockerfile:
- 修改
Program.cs的Kestrel配置:
builder.WebHost.UseUrls("http://0.0.0.0:8080");
- 更新Dockerfile的
EXPOSE指令为8080:
EXPOSE 8080
- 确保App Runner的容器端口设置为8080。
额外注意点
- 不需要在Docker中配置端口映射(比如
-p参数),App Runner会自动将外部请求转发到你配置的容器端口。 - 也可以通过设置
ASPNETCORE_URLS环境变量来覆盖Kestrel配置:在Dockerfile的final阶段添加ENV ASPNETCORE_URLS=http://0.0.0.0:8080,或者在App Runner的环境变量中直接设置,这样不需要修改Program.cs。
内容的提问来源于stack exchange,提问作者Mehmet Ceylan
相关产品推荐
相关产品推荐

