我实现了一个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在那儿,但是值没有被替换。
以其他方式如何处理此类案件?谢谢。
答案 0 :(得分:1)
appsetting.json从未更改,但是根据层次结构,变量值将被覆盖。看一下https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.2#conventions上的示例。效果很好。也许只是为了确保您不会因为命令行执行而中断某些操作,您可以尝试通过docker-compose分配环境变量。经验法则是,您用于“键”的模式必须(在__
而不是:
的帮助下)与json文件中的模式匹配,以便被覆盖。
答案 1 :(得分:0)
对于-e
,它将覆盖系统环境,该环境将在您从代码中检索时更改连接字符串,并且不会影响appsettings.json
中的内容。
例如
假设您有一个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": "*"
}
通过_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();
}
}
对于docker run -it -p 8888:80 dockerconfiguration
,它将返回"Server=(localdb)\\mssqllocaldb;Database=aspnet-TestDockerConfiguration-416C6FD2-3531-42D6-9EDE-18AC45901208;Trusted_Connection=True;MultipleActiveResultSets=true"
进行索引操作
对于docker run -it -p 8888:80 dockerconfiguration -e "ConnectionStrings:DefaultConnection"="testsqlstring"
,它将返回testsqlstring
因此,如果您只想在运行时覆盖appsettings.json
中的值,则只需指定类似步骤4
如果您希望更改Docker容器中的appsettings.json文件,可以按照以下步骤
vi
安装apt-get install vim -y
命令docker exec -it 43ea835776dd /bin/bash
进入容器ls
列出文件并找到appsettings.json
vi appsettings.json
修改内容cat appsettings.json
来检查内容是否已更改exit
并访问Home/Index
以检查结果。