如何在docker-compose中用.env变量替换appsettings.json值启动ASP.NET Core MVC应用
我有一个通过Docker部署的C#/ASP.NET Core MVC应用,此前一直在appsettings.json文件中硬编码变量,并在Startup.cs中通过以下代码访问:
services.Configure<ApiEndpoints>(Configuration.GetSection("ApiEndpoints"));
近期开始将部署变量添加到.env文件中,通过docker-compose --env-file .env up命令部署,但无法在.NET应用中访问.env文件里的变量。
例如,在Startup.cs中尝试执行:
Console.WriteLine(Configuration.GetSection("APPSETTINGS_DB_STR"));
其中.env文件中设置了变量APPSETTINGS_DB_STR=isThisLoggingCorrectly,但控制台输出为:
amaranth_main | Microsoft.Extensions.Configuration.ConfigurationSection
附:docker-compose.yml内容如下,且POSTGRES_USER、POSTGRES_PASSWORD和POSTGRES_DB能正常传递:
version: '3.8' volumes: data: services: postgresql_MENTIONvlt_bg: image: postgres # explicit container name container_name: postgresql_vlt_bg environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} ports: - 5432:5432 volumes: - data:/var/lib/postgresql_vlt_bg amaranth_main: container_name: amaranth_main links: - postgresql_MENTIONvlt_bg depends_on: - postgresql_MENTIONvlt_bg build: context: . dockerfile: Dockerfile ports: - 8000:5000 - 8001:5001 environment: - ASPNETCORE_ENVIRONMENT=Release - ASPNETCORE_Kestrel__Certificates__Default__Password=${Kestrel_Cert_Password} - ASPNETCORE_Kestrel__Certificates__Default__Path=${Kestrel_Cert_Rel_Path} - APPSETTINGS_DB_STR=${APPSETTINGS_DB_STR} volumes: - ${Kestrel_Cert_Abs_Path}:/https:ro
1. 修正变量读取代码
你当前调用Configuration.GetSection("APPSETTINGS_DB_STR")返回的是配置节对象,而非实际变量值。要读取具体内容,改用以下方式:
// 直接读取值 Console.WriteLine(Configuration["APPSETTINGS_DB_STR"]); // 更安全的方式,指定类型并处理空值 Console.WriteLine(Configuration.GetValue<string>("APPSETTINGS_DB_STR", defaultValue: "default_value"));
2. 利用ASP.NET Core环境变量映射规则
ASP.NET Core默认会将环境变量中的下划线_解析为配置路径的冒号:,这意味着你可以用环境变量覆盖appsettings.json中的层级配置:
- 若
appsettings.json里有"ApiEndpoints": { "DbStr": "xxx" },可以在.env中定义APIENDPOINTS_DB_STR=your_connection_string - 代码中仍可通过
Configuration.GetSection("ApiEndpoints").GetValue<string>("DbStr")读取到环境变量的值
如果不需要映射配置文件结构,直接用当前的APPSETTINGS_DB_STR变量名,通过Configuration["APPSETTINGS_DB_STR"]读取即可。
3. 确认配置加载优先级
ASP.NET Core的配置加载顺序为:环境变量 > 配置文件,只要你的docker-compose.yml正确将.env变量注入容器环境(从你的配置看已经正确配置了environment节点),且代码读取方式正确,就能获取到目标值。
内容的提问来源于stack exchange,提问作者ChristianOConnor

