【问题标题】:asp.net core override connection strings via ENV variablesasp.net 核心通过 ENV 变量覆盖连接字符串
【发布时间】:2019-06-05 17:07:26
【问题描述】:

我实现了一个 asp.net core API 2.2。我创建了一个泊坞窗图像。我想覆盖 appsettings.json 文件中的连接字符串。

有什么办法吗?当我使用命令docker container run -e "ConnectionStrings:DefaultConnection={...here goes the connection string}"启动容器时,我尝试通过环境变量@

我的 Startup.cs 中也有 builder.AddEnvironmentVariables();,但我的 appsetting.json 中的连接字符串没有被替换。

我在容器中检查了它,appsetting.json 在那里,但值没有被替换。

还有其他方法可以处理这种情况吗?谢谢。

【问题讨论】:

  • 将: 替换为__ (2x _)。
  • @KirkLarkin 我试过了。这是行不通的。 docker run -d -e ConnectionStrings__CommonDbConnection='Server=.\\SQLEXPRESS;Database=CommonDb;Trusted_Connection=True;MultipleActiveResultSets=true' -e ConnectionStrings__SharedDbConnection='Server=.\\SQLEXPRESS;Database=SharedDb;Trusted_Connection=True;MultipleActiveResultSets=true' 还有其他建议吗?

标签: c# docker asp.net-core


【解决方案1】:

对于-e,它会覆盖系统环境,当你从代码中检索时会改变连接字符串,它不会影响appsettings.json中的内容。

例如

  1. 假设你有一个appsettings.json 喜欢

    {
        "ConnectionStrings": {
            "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-TestDockerConfiguration-416C6FD2-3531-42D6-9EDE-18AC45901208;Trusted_Connection=True;MultipleActiveResultSets=true"
        },
        "Logging": {
            "LogLevel": {
            "Default": "Warning"
            }
        },
        "AllowedHosts": "*"
    }
    
  2. 通过_configuration.GetConnectionString("DefaultConnection") 检索连接字符串

    public class HomeController : Controller
    {
        private readonly IConfiguration _configuration;
        public HomeController(IConfiguration configuration)
        {
            _configuration = configuration;
        }
        public IActionResult Index()
        {
            return Ok(_configuration.GetConnectionString("DefaultConnection"));
            //return View();
        }
    }
    
  3. 对于docker run -it -p 8888:80 dockerconfiguration,它将为索引操作返回"Server=(localdb)\\mssqllocaldb;Database=aspnet-TestDockerConfiguration-416C6FD2-3531-42D6-9EDE-18AC45901208;Trusted_Connection=True;MultipleActiveResultSets=true"

  4. 对于docker run -it -p 8888:80 dockerconfiguration -e "ConnectionStrings:DefaultConnection"="testsqlstring",它将返回testsqlstring

  5. 所以,如果你只想在运行时覆盖appsettings.json中的值,你只需要像第4步一样指定

如果您更喜欢更改 docker 容器中的 appsettings.json 文件,您可以按照以下步骤操作

  1. 使用apt-get install vim -y 安装vi 命令
  2. 运行docker exec -it 43ea835776dd /bin/bash进入容器
  3. 运行ls 列出文件并找到appsettings.json
  4. 运行vi appsettings.json修改内容
  5. 运行cat appsettings.json检查内容是否改变
  6. 运行exit 并访问Home/Index 以检查结果。

【讨论】:

  • "ConnectionStrings:DefaultConnection"="testsqlstring" 不适用于 Linux。 Microsoft 建议使用适用于所有平台的双下划线,如下所示:"ConnectionStrings__DefaultConnection"="testsqlstring"
  • 我还需要将.AddEnvironmentVariables() 添加到我的配置生成器中。
  • 该命令必须在环境变量后有容器名称,如:docker run -it -p 8888:80 -e "ConnectionStrings:DefaultConnection"="testsqlstring" dockerconfiguration 解决方法见文章:stackoverflow.com/questions/50181031/…
【解决方案2】:

appsetting.json 永远不会改变,但是根据层次结构,变量值会被覆盖。查看https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.2#conventions 的示例。它工作得很好。也许只是为了确保您没有因为命令行执行而破坏某些东西,您可以尝试通过 docker-compose 分配环境变量。经验法则是,您用于“键”的模式必须匹配(在 __ 而不是 : 的帮助下)您在 json 文件中的内容,以便它被覆盖。

【讨论】:

    【解决方案3】:

    尝试不带引号的 ConnectionStrings 部分,它可以工作(在 PowerShell 控制台上。

    docker run -d -p 8080:80 --name letscosmosweb -e ConnectionStrings__ProductsDbContext=$key letscosmosweb:v1
    

    $key 变量包含连接字符串

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 2017-03-13
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      相关资源
      最近更新 更多