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

Docker-Compose中无法访问.Net Core微服务Writer.API求助

问题描述

我是Docker新手,正在使用.NET Core构建微服务项目,包含Identity.API和Writer.API两个服务。docker-compose配置如下:

version: '3.4'

services:
 identity.api:
  image: ${DOCKER_REGISTRY-}identityapi
  build:
   context: .
   dockerfile: Services/Identity/Identity.API/Dockerfile
  ports: 
   - "5100:80"
   - "5101:443"
  depends_on:
  - sqldata
  - rabbitmq
 
 writer.api:
  image: ${DOCKER_REGISTRY-}writerapi
  build:
   context: .
   dockerfile: Services/Writer/Writer.API/Dockerfile
  ports:
   - "5200:80"
   - "5201:443"
  depends_on:
   - rabbitmq

 rabbitmq: # login guest:guest
  image: rabbitmq:3-management
  hostname: "rabbitmq"
  labels: 
   NAME: "rabbitmq"
  ports:
    - "4369:4369"
    - "5671:5671"
    - "5672:5672"
    - "25672:25672"
    - "15671:15671"
    - "15672:15672"

启动后,Identity.API可通过https://localhost:5101/swagger/index.html正常访问Swagger,但访问Writer.API的https://localhost:5201/swagger/index.html时提示找不到。单独运行Writer.API的Docker容器则正常。

Swagger启动配置如下:

public static IServiceCollection AddSwaggerConfiguration(
    this IServiceCollection services, IConfiguration configuration)
{
    services.AddSwaggerGen(swaggerGenOptions =>
    {
        swaggerGenOptions.SwaggerDoc("v1", new OpenApiInfo
        {
            Title = configuration["Swagger:ApiName"],
            Version = configuration["Swagger:ApiVer"]
        });

        //...
    });

    return services;
}
   
public static class DependencyInjection
{
    public static IServiceCollection AddPresentation(
        this IServiceCollection services, IConfiguration configuration)
    {
        services.AddControllers();
        services.AddMappings();
        services.AddSwaggerConfiguration(configuration);

        services.AddCors(options =>
        {
            options.AddPolicy(
            "CorsPolicy",
             builder => builder.AllowAnyOrigin()
                 .AllowAnyMethod()
                 .AllowAnyHeader());
        });

        return services;
    }
}

//Program.cs
builder.Services
    .AddApplication(configuration!)
    .AddInfrastructure(configuration!)
    .AddPresentation(configuration!);

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

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

//...

另外,Identity.API容器有4个地址,而Writer.API只有2个,不清楚配置哪里出错,恳请帮助。


解决方案

1. 修复Swagger重复注册问题

你的Program.cs中,已经通过AddPresentation方法注册了Swagger相关服务,但后续又重复调用了builder.Services.AddEndpointsApiExplorer();和builder.Services.AddSwaggerGen();,这会覆盖AddSwaggerConfiguration中的自定义配置,导致Writer.API的Swagger文档生成异常。

修改Program.cs,删除重复的注册代码:

//Program.cs
builder.Services
    .AddApplication(configuration!)
    .AddInfrastructure(configuration!)
    .AddPresentation(configuration!);

// 移除以下三行重复代码
// builder.Services.AddControllers();
// builder.Services.AddEndpointsApiExplorer();
// builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

//...

2. 确保容器加载Swagger配置

单独运行正常但docker-compose启动异常,大概率是容器未正确读取Swagger配置项。可以通过以下方式处理:

  • 检查Writer.API的appsettings.json是否正确配置了Swagger:ApiName和Swagger:ApiVer;
  • 在docker-compose.yml的writer.api服务中添加环境变量,强制注入配置:
writer.api:
  image: ${DOCKER_REGISTRY-}writerapi
  build:
   context: .
   dockerfile: Services/Writer/Writer.API/Dockerfile
  ports:
   - "5200:80"
   - "5201:443"
  depends_on:
   - rabbitmq
  environment:
    - ASPNETCORE_ENVIRONMENT=Development
    - Swagger__ApiName=Writer.API
    - Swagger__ApiVer=v1

3. 容器地址数量差异的说明

Identity.API容器有4个地址是因为它依赖sqldata和rabbitmq,Docker会为其分配多个内部网络地址(连接默认桥接网络和服务关联的自定义网络);Writer.API仅依赖rabbitmq,所以地址数量更少,这是正常现象,和Swagger访问问题无关。

4. 验证容器内服务状态

如果上述方法无效,可进入容器内部排查:

  • 执行命令进入容器:docker exec -it <writer-api-container-id> bash
  • 测试容器内Swagger文档是否存在:curl http://localhost/swagger/v1/swagger.json
  • 若容器内访问也失败,查看服务日志定位问题:docker logs <writer-api-container-id>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:15:59