Pal*_*lBo 1 .net c# nginx swagger docker
在我的项目中,我在 Startup.cs 中设置了 Swagger 和 Swashbuckle:
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");
});
Run Code Online (Sandbox Code Playgroud)
当我从 Visual Studio 运行我的应用程序时,我可以访问localhost:123456/swagger并获取 API 文档,就像它应该的那样。但是,当我通过 Docker 运行我的应用程序docker-compose up并访问时,example_IP/swagger我发现 404 未找到。example_IP用 Postman测试给了我预期的数据,所以 IP 或后端没有问题。我尝试了几个不同的 URL /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
- |
Run Code Online (Sandbox Code Playgroud)
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"]
Run Code Online (Sandbox Code Playgroud)
Cha*_*sup 15
我怀疑这对最初的问题有帮助,但我只是打了这个。现在 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"));
}
Run Code Online (Sandbox Code Playgroud)
这在 Visual Studio 的 Docker 工具中运行良好,但如果您在不进行任何更改的情况下构建 Dockerfile,它将构建为 Release,并且 Swagger 将无法访问。
因此,如果您希望 Swagger 仍然可用,这只是将容器投入生产时的一个问题。
解决方法是将两条 swagger 线移出env.IsDevelopment()条件。