You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器中运行ASP.NET Core Web API遇故障求助

ASP.NET Core Web API容器部署Swagger无法访问问题

我是Docker新手,已安装Docker Desktop,尝试通过Docker容器暴露ASP.NET Core Web API。镜像和容器能成功创建,但运行后无法正常显示Swagger页面,出现错误页面。

Dockerfile配置

# This stage is used to build the service project
FROM *****/dotnet-80-sdk-runtime:latest AS builder #local artificatory within my company
ARG BUILD_CONFIGURATION=Release
WORKDIR /build
USER root
COPY ./NuGet.Config ./NuGet.Config 
COPY . .
RUN ls -la
RUN dotnet restore "./GrafProm.API.csproj" --configfile ./NuGet.Config
RUN dotnet build "./GrafProm.API.csproj" -c Release --no-restore -o /app/buildOutput
RUN dotnet publish "./GrafProm.API.csproj" -c Release --no-restore -o /app/publish

FROM *****/dotnet-80-runtime:latest AS run
EXPOSE 8080
ENV ASPNETCORE_URLS=http://+:8080
ENV DOTNET_ROOT=/usr/mware/dotnet
ENV ASPNETCORE_ENVIRONMENT=development
USER root
RUN mkdir -p /var/log/containers
#
WORKDIR /app
COPY --from=builder /app/publish .
ENTRYPOINT ["dotnet", "GrafProm.API.dll"]

launchsettings.json配置

"profiles": {
    "http": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "dotnetRunMessages": true,
      "applicationUrl": "http://localhost:5293"
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "Container (Dockerfile)": {
      "commandName": "Docker",
      "launchBrowser": true,
      "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
      "environmentVariables": {
        "ASPNETCORE_HTTP_PORTS": "8080"
      },
      "publishAllPorts": true,
      "useSSL": false
    }

错误现象

运行VS 2022的「Container (Dockerfile)」配置后,浏览器(IE)打开错误页面,无法加载Swagger。


排查与解决方案

1. 确认Swagger环境启用逻辑

ASP.NET Core默认仅在Development环境启用Swagger,检查Program.cs配置:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// 确保开发环境下启用Swagger
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
// 其他中间件配置

同时验证容器内环境变量是否正确:

docker exec <容器ID> echo $ASPNETCORE_ENVIRONMENT

2. 端口映射与访问地址检查

  • 查看容器实际端口映射:
docker ps

找到容器的PORTS列(如0.0.0.0:5000->8080/tcp),此时需访问http://localhost:5000/swagger而非8080。

  • 更换Chrome/Edge等现代浏览器测试,IE对Swagger兼容性较差。

3. 容器内服务状态验证

进入容器内部检查服务运行情况:

docker exec -it <容器ID> bash
# 查看dotnet进程
ps aux | grep dotnet
# 测试本地Swagger接口
curl http://localhost:8080/swagger/v1/swagger.json

若curl返回正常JSON,说明服务正常,问题在外部访问;若失败,查看容器日志排查启动错误:

docker logs <容器ID>

4. 构建与环境配置一致性

Dockerfile用Release模式发布,但launchsettings配置为开发环境,可二选一调整:

  • 测试阶段改为Debug模式发布:
RUN dotnet publish "./GrafProm.API.csproj" -c Debug --no-restore -o /app/publish
  • 或允许Release环境启用Swagger(不建议生产环境):
if (app.Environment.IsDevelopment() || app.Environment.IsProduction())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

内容的提问来源于stack exchange,提问作者user1447718

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 10:33:11