asp.net 核心通过 ENV 变量覆盖连接字符串

tha*_*dam 8 c# docker asp.net-core

我实现了一个 asp.net 核心 API 2.2。我已经创建了一个 docker 镜像。我想覆盖 appsettings.json 文件中的连接字符串。

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

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

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

任何其他方式如何处理这种情况?谢谢。

Tao*_*hou 10

对于-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": "*"
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过_configuration.GetConnectionString("DefaultConnection")like 检索连接字符串

    public class HomeController : Controller
    {
        private readonly IConfiguration _configuration;
        public HomeController(IConfiguration configuration)
        {
            _configuration = configuration;
        }
        public IActionResult Index()
        {
            return Ok(_configuration.GetConnectionString("DefaultConnection"));
            //return View();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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. 安装vi命令 apt-get install vim -y
  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"` (5认同)
  • 该命令必须在环境变量后面包含容器名称,如下所示: `docker run -it -p 8888:80 -e "ConnectionStrings:DefaultConnection"="testsqlstring" dockerconfiguration` 从文章中找到解决方案:https://stackoverflow.com /questions/50181031/passing-environment-variables-not-working-with-docker (3认同)
  • 我还需要将 `.AddEnvironmentVariables()` 添加到我的配置生成器中。 (2认同)

Ahm*_*met 5

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