.NET 7洋葱架构应用Docker部署遇DirectoryNotFoundException错误求助
问题分析与解决方案
错误根源
你遇到的System.IO.DirectoryNotFoundException是因为Persistence层硬编码了相对路径读取appsettings.json,在Docker容器环境下,发布后的应用目录结构和本地开发环境完全不同:
- 容器中API的工作目录是
/app,仅包含发布后的dll、配置文件等,不存在../../Presentation/EgeBilgiTaskCase.API这个路径 - 你已经通过
docker-compose.yml注入了环境变量ConnectionStrings__SQLServer,完全不需要手动读取配置文件
修复步骤
1. 移除硬编码的配置读取逻辑
删除EgeBilgiTaskCase.Persistence.Configuration类,改用.NET原生的依赖注入获取配置。
2. 调整持久化服务注册代码
修改EgeBilgiTaskCase.Persistence.ServiceRegistration.cs,通过注入的IConfiguration获取连接字符串:
using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace EgeBilgiTaskCase.Persistence { public static class ServiceRegistration { public static void AddPersistenceServices(this IServiceCollection services, IConfiguration configuration) { // 直接从IConfiguration获取连接字符串,自动优先读取环境变量 services.AddDbContext<YourDbContext>(options => options.UseSqlServer(configuration.GetConnectionString("SQLServer"))); // 其他持久化服务注册代码... } } }
3. 在API项目中传递配置到持久化层
修改Presentation/EgeBilgiTaskCase.Api/Program.cs,注册持久化服务时传入builder.Configuration:
var builder = WebApplication.CreateBuilder(args); // 注册持久化服务,传递配置对象 builder.Services.AddPersistenceServices(builder.Configuration); // 其他中间件、Swagger等注册代码... var app = builder.Build(); // 中间件管道配置... app.Run();
4. 补全Docker Compose中的SQL Server服务
你的docker-compose.yml缺少SQL Server容器定义,添加后才能让API正确连接数据库:
version: '3.8' services: api: build: context: . dockerfile: Dockerfile ports: - "5006:80" environment: - ASPNETCORE_ENVIRONMENT=Development - ConnectionStrings__SQLServer=User ID=SA;Password=password;Data Source=db;Initial Catalog=dbname;TrustServerCertificate=True; - Token__Audience=www.Token__Audience.com - Token__Issuer=www.Token__Issuer.com - Token__SecurityKey=Token__SecurityKey networks: - mynetwork # 确保API在SQL Server启动后再启动 depends_on: - db # 添加SQL Server容器 db: image: mcr.microsoft.com/mssql/server:2022-latest container_name: EgeBilgiTaskCase environment: - SA_PASSWORD=password - ACCEPT_EULA=Y ports: - "1433:1433" networks: - mynetwork networks: mynetwork: driver: bridge
验证部署
- 重新构建并启动容器:
docker-compose down && docker-compose up --build
- 访问Swagger UI(
http://localhost:5006/swagger),测试接口即可正常连接数据库
内容的提问来源于stack exchange,提问作者Ayşe Tuluk
相关产品推荐
相关产品推荐

