当应用程序在 Docker 容器中运行时,Swagger UI 给出 ​​404

2024-03-31

在我的项目中,我在 Startup.cs 中使用 Swashbuckle 设置了 Swagger:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "Example API", Version = "v1" });
            });

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
            });

当我从 Visual Studio 运行应用程序时,我可以访问localhost:123456/swagger并获取 API 文档,就像它应该的那样。但是,当我通过 Docker 运行我的应用程序时docker-compose up和访问example_IP/swagger我收到 404 未找到。测试example_IP使用 Postman 为我提供了预期的数据,因此 IP 或后端没有任何问题。我尝试过几个不同的网址,/swagger, /swagger-ui.html等,但没有区别。在 Docker 容器中运行时,是否必须在 Dockerfile 或其他地方编写任何特定配置才能访问 Swagger 文档?我通过 nginx 反向代理运行我的后端,不确定这是否重要。

Docker-compose 文件:

version: "3.7"
services:
  dotnet-backend:
    container_name: dotnet-backend
    build: .
   #expose:
    #  - "80"
    links:
      - mssql-db
    ports:
      - "8000:80"
  nginx-reverse-proxy:
    container_name: nginx-reverse-proxy
    build: ./nginx/
    #command: tail -F /dev/null
    command: nginx -g 'daemon off;'
    ports:
      - "80:80"
    #  - "443:443"
    expose:
      - "80"
      - "443"
    links:
      - dotnet-backend
  mssql-db:
    container_name: mssql-db
    #image: mcr.microsoft.com/mssql/server:2019-latest
    build: ./Database
    environment: 
      - SA_PASSWORD=password
      - ACCEPT_EULA=Y
    volumes:
     - ./Database/:/scripts/
    ports:
      - "1433:1433"
    expose:
      - "1433"
    command:
      - /bin/bash
      - -c 
      - |

Dockerfile:

FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Debug -o out Project.csproj

# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
WORKDIR /app
COPY --from=build-env /app/out .

EXPOSE 80

ENTRYPOINT ["dotnet", "ProjectApi.dll", "--environment=Development"]

我怀疑这对原来的问题有帮助,但我刚刚击中了这个。 既然 WebApi 模板内置了 Swagger,那么通过手动步骤(docker run)或 Visual Studio 运行容器时可能会很棘手。

Swagger UI 现在默认位于“开发”块中:

if (env.IsDevelopment())
{
  app.UseDeveloperExceptionPage();
  app.UseSwagger();
  app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "test v1"));
}

这在 Visual Studio 的 Docker 工具中运行良好,但如果您构建 Dockerfile 而不进行更改,它将构建为 Release,并且 Swagger 将无法访问。

因此,如果您希望 Swagger 仍然可用,那么这只是将容器投入生产时的一个问题。

解决方法是将两条招摇线移出env.IsDevelopment()有条件的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当应用程序在 Docker 容器中运行时,Swagger UI 给出 ​​404 的相关文章

随机推荐