问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

.NET配置体系结构:环境变量与Docker Compose实战

创作时间:
作者:
@小白创作中心

.NET配置体系结构:环境变量与Docker Compose实战

引用
CSDN
1.
https://blog.csdn.net/sd7o95o/article/details/142036765

在.NET应用程序开发中,配置管理是一个核心且复杂的任务。本文将探讨如何在ASP.NET应用程序中有效地管理数据库连接字符串配置,通过使用环境变量和命令行参数等配置源,结合Docker Compose进行部署,实现更安全、更灵活的配置管理方案。

假设我们正在开发一个名为"Confitecture"的ASP.NET应用程序。为了连接数据库,我们需要将连接字符串存储在适当的位置。传统的做法是使用appsettings.json文件,其中包含生产环境的连接字符串:

{
    "ConnectionStrings": {
        "Db": "ProductionDbConnectionString"
    },
    // ...
}

同时,我们可以为开发环境创建一个单独的配置文件appsettings.Development.json

{
    "ConnectionStrings": {
        "Db": "DevelopmentDbConnectionString"
    },
    // ...
}

然后在代码中使用以下方式获取连接字符串:

var dbConnectionString = app.Configuration.GetConnectionString("Db");
app.Logger.LogInformation("Db Connection string: {dbConnectionString}", dbConnectionString);

这种方法虽然简单,但存在以下问题:

  1. 在代码中存储连接字符串不安全,任何开发人员都可以轻松访问生产数据库密码。
  2. 随着环境数量的增加,会导致大量重复的配置文件,维护混乱。
  3. 默认配置源可能导致意外连接到生产环境。
  4. 配置新环境时容易出现配置错误。

使用环境变量

环境变量和命令行参数提供了更安全、更灵活的配置方式。让我们通过一个实际示例来展示如何使用环境变量。

首先,添加EF Core支持PostgreSQL:

dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL

然后更新Program.cs以连接到数据库:

using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<DbContext>(
    o => o.UseNpgsql(builder.Configuration.GetConnectionString("Db"))
);
var app = builder.Build();
app.MapGet("/", async (DbContext context) => {
    await context.Database.OpenConnectionAsync();
    return "Connected!";
});
app.Run();

接下来,使用Docker Compose来部署应用程序和PostgreSQL数据库。创建Dockerfile

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
EXPOSE 8080
WORKDIR /app

COPY . .
RUN dotnet publish "Confitecture.csproj" -c Release -o /app/publish
WORKDIR /app/publish
ENTRYPOINT dotnet Confitecture.dll

然后创建compose.yml

name: confitecture
services:
  app:
    image: confitecture
    ports:
- "53593:8080"
    build: .
    profiles: [ "full" ]
    environment:
- CONNECTIONSTRINGS__DB=Host=db;Port=5432;Username=postgres;Password=postgres
- ASPNETCORE_ENVIRONMENT=Development
  db:
    image: postgres
    environment:
- POSTGRES_PASSWORD=postgres
    ports:
- "5432:5432"

运行以下命令启动服务:

docker compose up -d && sleep 1 && curl localhost:53593

使用LaunchSettings简化开发

为了方便开发人员调试,可以使用launchSettings.json配置本地开发环境:

{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "profiles": {
    "Local": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "http://localhost:53593",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "CONNECTIONSTRINGS__DB": "Host=localhost;Port=5432;Username=postgres;Password=postgres"
      }
    }
  }
}

这样,开发人员只需运行dotnet run即可启动应用程序。

通过使用环境变量和Docker Compose,我们可以实现更安全、更灵活的配置管理方案,同时保持开发环境的便利性。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号