gpt4 book ai didi

asp.net - 从 ASP.NET Core Controller 读取 docker-compose 环境变量

转载 作者:行者123 更新时间:2023-12-05 01:06:42 24 4
gpt4 key购买 nike

我正在尝试对 ASP.NET Core 5 Web API 项目进行 dockerize,因此我将把所有配置从 appSettings.json 转移到 docker-compose 环境部分。然后从 Controller 的环境部分读取它们。这个应该怎么做?

我曾尝试在 Controller 中使用 IConfigurationEnvironment,但我刚刚得到 Null

我的 Program.cs 是:

namespace Order.Api
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
}
}

StartUp.cs 是:

namespace Order.Api
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<OrderContext>(options =>
options.UseSqlServer(Configuration.GetValue<string>("ConnectionString")));
// options.UseSqlServer(Configuration.GetConnectionString("ConnectionString")));

services.AddControllers();
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo {Title = "Order.Api", Version = "v1"}); });
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Order.Api v1"));
}

app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
}
}
}

docker-compose.override 是:

version: '3.4'

services:

Order.Api :
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://0.0.0.0:80
- ConnectionString=${ESHOP_AZURE_ORDERING_DB:-Server=sqldata;Database=Order;User Id=sa;Password=Pass@word}
- MyConfig=Active
ports:
- "5001:80"


sqldata :
environment:
- SA_PASSWORD=Pass@word
- ACCEPT_EULA=Y
ports:
- "5433:1433"
volumes:
- order-sqldata:/var/opt/mssql



volumes:
order-sqldata:
external: false

最佳答案

ASP.NET Core提供从不同位置加载配置的能力:

  • appsettings.json
  • appsetting.<EnvName>.json
  • 环境变量
  • 用户 secret
  • 命令行参数

您不必担心设置的来源。从开发人员的角度来看也是如此。你可以把它想象成一堆层(每个下一层都会覆盖上一层的设置)。例如。当您的应用程序启动时,它会尝试从 appsettings.json 加载默认设置。 ,然后通过 appsetting.<EnvName>.json 中的设置覆盖它,然后来自环境变量等。

因此,当您尝试覆盖 ConnectionString在环境变量中,首先需要检查它appsettings.json .那里是如何定义的?让我们创建最简单的配置:

{
"ConnectionStrings": {
"ConnectionString": "from config"
},
"MyConfig": {
"Key": "from config"
}
}

Startup.cs 中读取此连接,您无需更改任何内容。使用您的 options.UseSqlServer(Configuration.GetConnectionString("ConnectionString"))); .

要在环境变量中覆盖它,您需要为其提供特定名称:ConnectionStrings__ConnectionString=<new_connection> .很简单,你需要扁平化你的 JSON 配置并使用 __ (双下划线)作为分隔符。

对于自定义配置(如 MyConfig ),您需要做更多的事情。您需要创建选项类,例如:

public class MyConfigOption
{
public string Key { get; set; }
}

并在 Startup.cs 中进行配置:

services.Configure<MyConfigOption>(Configuration.GetSection("MyConfig"));

然后您将能够在环境变量中覆盖它MyConfig__Key=value .

要在你的 Controller 中使用它,你需要向 DI 询问这个选项:

public Controller(IOptions<MyConfigOption> options)
{
this.options = options;
}

options将包含您的配置。

Docs了解更多详情。

关于asp.net - 从 ASP.NET Core Controller 读取 docker-compose 环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68506243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com