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

.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

验证部署

  1. 重新构建并启动容器:
docker-compose down && docker-compose up --build
  1. 访问Swagger UI(http://localhost:5006/swagger),测试接口即可正常连接数据库

内容的提问来源于stack exchange,提问作者Ayşe Tuluk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 10:45:00