.NET 5.0 Web API 容器化后无法访问站点问题求助
问题根因
访问失败是三个问题共同导致的:
- 环境变量未生效:你将
ASPNETCORE_URLS配置在了base构建阶段,但最终容器运行使用的是单独拉取的runtime阶段镜像,没有继承该环境变量,应用在容器内默认监听80端口,而非你预期的5000 - 端口映射与访问地址不匹配:你启动容器时配置的映射规则为
8000:5000,端口映射规则永远是「宿主机端口:容器内端口」,也就是宿主机8000端口才会转发到容器的5000端口,但你直接访问localhost:5000,没有走映射规则,自然无法访问 - Swagger默认未启用:.NET 5默认仅在
Development环境下加载Swagger中间件,容器运行时默认环境为Production,就算接口可通,访问Swagger路径也会返回404
修正方案
1. 调整Dockerfile
将环境变量配置挪到最终运行的runtime阶段,统一端口逻辑,同时配置开发环境启用Swagger,修正后的Dockerfile如下:
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base WORKDIR /app EXPOSE 80 FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build WORKDIR /src COPY ["API/WebUI/Summit.API.csproj", "API/WebUI/"] COPY ["Application/Summit.Application.csproj", "Application/"] COPY ["Domain/Shared/Summit.Domain.csproj", "Domain/Shared/"] COPY ["Domain/SqlKata.Execution/SqlKata.Execution.csproj", "Domain/SqlKata.Execution/"] COPY ["Domain/QueryBuilder/QueryBuilder.csproj", "Domain/QueryBuilder/"] COPY ["Infrastructure/Summit.Infrastructure.csproj", "Infrastructure/"] RUN dotnet restore "API/WebUI/Summit.API.csproj" COPY . . WORKDIR "/src/API/WebUI" RUN dotnet build "Summit.API.csproj" -c Release FROM build AS publish RUN dotnet publish "Summit.API.csproj" -c Release FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS runtime WORKDIR /app COPY --from=publish /src/API/WebUI/bin/Release/net5.0/publish . EXPOSE 80 # 配置开发环境启用Swagger ENV ASPNETCORE_ENVIRONMENT=Development # 配置应用监听80端口 ENV ASPNETCORE_URLS=http://*:80 ENTRYPOINT ["dotnet", "Summit.API.dll"]
2. 重新构建镜像并启动容器
使用修正后的Dockerfile重新构建镜像,之后执行以下命令启动容器:
docker container run -itd -p 5000:80 镜像ID
3. 访问验证
容器启动完成后,访问http://localhost:5000/swagger即可正常打开Swagger页面。
内容的提问来源于stack exchange,提问作者Chandra Shekhar
相关产品推荐
相关产品推荐

