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

