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

vbopmzt1  于 2022-12-11  发布在  Docker
关注(0)|答案(4)|浏览(121)

我已经实现了asp.net核心API 2.2。我已经创建了一个Docker映像。我想覆盖appsettings.json文件中的连接字符串。
有什么办法吗?我尝试通过环境变量,当我用命令docker container run -e "ConnectionStrings:DefaultConnection={...here goes the connection string}"启动容器
我的Startup.cs中也有builder.AddEnvironmentVariables();,但appsetting.json中的连接字符串没有被替换。
我在容器中检查了它,appsetting.json在那里,但是值没有被替换。
有没有其他方法如何处理这样的情况?Thx。

i2byvkas

i2byvkas1#

对于-e,它将覆盖系统环境,当您从代码中检索时,系统环境将更改connectionstring,它不会影响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": "*"
}

1.通过_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();
    }
}

1.对于docker run -it -p 8888:80 dockerconfiguration,它将为索引操作返回"Server=(localdb)\\mssqllocaldb;Database=aspnet-TestDockerConfiguration-416C6FD2-3531-42D6-9EDE-18AC45901208;Trusted_Connection=True;MultipleActiveResultSets=true"
1.对于docker run -it -p 8888:80 dockerconfiguration -e "ConnectionStrings:DefaultConnection"="testsqlstring",它将返回testsqlstring
1.因此,如果只想在运行时覆盖appsettings.json中的值,只需像步骤4那样指定
如果您更喜欢在Docker容器中更改appsettings.json文件,可以按照以下步骤操作
1.使用apt-get install vim -y安装vi命令
1.运行docker exec -it 43ea835776dd /bin/bash以进入容器
1.运行ls列出文件并查找appsettings.json
1.运行vi appsettings.json以修改内容
1.运行cat appsettings.json,检查内容是否发生变化
1.运行exit并访问Home/Index以检查结果。

wqsoz72f

wqsoz72f2#

json永远不会被更改,但是基于层次结构,变量值会被覆盖。看看www.example.com上的例子https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.2#conventions。它运行得很好。也许只是为了确保您没有因为命令行执行而破坏某些东西,您可以尝试通过docker-compose来分配环境变量。(在__而不是:的帮助下)您在json文件中的内容,以便覆盖它。

gmxoilav

gmxoilav3#

尝试在ConnectionStrings部分不加引号的情况下运行,它工作正常(在PowerShell控制台上)。

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

$key变量包含连接字符串

jmo0nnb3

jmo0nnb34#

如果您使用docker-compose

除了在.env中指定变量之外,不要忘记在docker-compose.ymlenvironments部分中设置它。

相关问题