首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当应用程序在Docker容器中运行时,Swagger UI显示404

当应用程序在Docker容器中运行时,Swagger UI显示404
EN

Stack Overflow用户
提问于 2020-01-20 21:11:49
回答 2查看 2.9K关注 0票数 2

在我的项目中,我在我的Startup.cs中设置了Swagger with Swashbuckle,如下所示:

代码语言:javascript
复制
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并获得应用程序接口文档,就像它应该做的那样。然而,当我使用docker-compose up和access example_IP/swagger通过Docker运行我的应用程序时,我得到了一个404Not found。用Postman测试example_IP得到了预期的数据,所以IP和后端都没有问题。我尝试了几个不同的URL,/swagger/swagger-ui.html等,但没有区别。在Docker容器中运行时,是否存在必须写入Dockerfile或其他地方才能访问Swagger文档的特定配置?我正在通过nginx反向代理运行我的后端,不确定这是否重要。

Docker-compose文件:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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"]
EN

回答 2

Stack Overflow用户

发布于 2021-01-09 05:05:52

我怀疑这会对原始问题有所帮助,但我刚刚提到了这一点。既然WebApi模板已经内置了Swagger,那么在通过手动步骤(docker run)或Visual Studio运行容器时可能会很棘手。

默认情况下,Swagger UI现在位于"Development“块中:

代码语言:javascript
复制
if (env.IsDevelopment())
{
  app.UseDeveloperExceptionPage();
  app.UseSwagger();
  app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "test v1"));
}

这在Visual Studio的Docker工具中工作得很好,但如果您构建Dockerfile而不做任何更改,它将作为发行版构建,并且Swagger将无法访问。

因此,如果您希望Swagger仍然可用,这只是将容器移动到生产环境中时的一个问题。

修复方法是将两个夸张的行从env.IsDevelopment()条件中移出。

票数 19
EN

Stack Overflow用户

发布于 2021-01-23 05:54:51

我通过在反向代理中使用容器主机名而不是使用容器ip地址修复了此问题。Swagger UI现在可以正常工作了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59824036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档