在我的项目中,我在我的Startup.cs中设置了Swagger with 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");
});当我从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文件:
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"]发布于 2021-01-09 05:05:52
我怀疑这会对原始问题有所帮助,但我刚刚提到了这一点。既然WebApi模板已经内置了Swagger,那么在通过手动步骤(docker run)或Visual Studio运行容器时可能会很棘手。
默认情况下,Swagger UI现在位于"Development“块中:
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()条件中移出。
发布于 2021-01-23 05:54:51
我通过在反向代理中使用容器主机名而不是使用容器ip地址修复了此问题。Swagger UI现在可以正常工作了。
https://stackoverflow.com/questions/59824036
复制相似问题