Ubuntu 22.04下DotNet 7应用Docker部署后无法访问求助
Docker打包DotNet 7应用后无法外部访问问题处理
我在Ubuntu 22.04系统上开发DotNet 7应用,本地执行dotnet run后可正常通过localhost:7222访问应用,但使用提供的Dockerfile构建镜像并映射5000端口运行容器后,无法在浏览器访问该应用,Windows环境下也出现相同问题。
本地运行日志
dotnet run Building... warn: Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer[8] The ASP.NET Core developer certificate is not trusted. For information about trusting the ASP.NET Core developer certificate, see https://aka.ms/aspnet/https-trust-dev-cert. info: Microsoft.Hosting.Lifetime[14] Now listening on: https://localhost:7222 info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:5222 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Development info: Microsoft.Hosting.Lifetime[0] Content root path: /home/fit/Desktop/webapp/Dental App
Dockerfile内容
# Multi stage Docker Image Build # Build Stage FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build WORKDIR /source COPY . . RUN dotnet restore "./Dental App.csproj" --disable-parallel COPY . ./ RUN dotnet publish "./Dental App.csproj" -c release -o /app # Serve Stage FROM mcr.microsoft.com/dotnet/sdk:7.0 WORKDIR /app COPY --from=build /app ./ EXPOSE 5000 ENTRYPOINT ["dotnet", "Dental App.dll"]
容器运行日志
$ docker container run --publish 5000:5000 appdental:latest info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:5000 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Production info: Microsoft.Hosting.Lifetime[0] Content root path: /app
问题原因
容器日志显示应用仅监听localhost:5000,这意味着应用只能接收容器内部的请求,外部主机无法通过映射的端口访问。
解决方法
方法1:通过环境变量指定监听地址
修改Dockerfile的Serve阶段,添加环境变量让Kestrel监听所有IP:
# Serve Stage FROM mcr.microsoft.com/dotnet/aspnet:7.0 # 推荐用runtime镜像替代sdk,减少镜像体积 WORKDIR /app COPY --from=build /app ./ ENV ASPNETCORE_URLS=http://0.0.0.0:5000 EXPOSE 5000 ENTRYPOINT ["dotnet", "Dental App.dll"]
方法2:在启动命令中指定监听地址
直接修改ENTRYPOINT命令,添加--urls参数:
ENTRYPOINT ["dotnet", "Dental App.dll", "--urls=http://0.0.0.0:5000"]
额外优化
Serve阶段使用mcr.microsoft.com/dotnet/aspnet:7.0镜像而非sdk镜像,因为sdk包含编译工具,运行时不需要,能大幅减小镜像体积。
内容的提问来源于stack exchange,提问作者4tire
相关产品推荐
相关产品推荐

