Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker ASP.NET核心配置值有时在Kubernetes中返回空值_Docker_Asp.net Core_Kubernetes_Environment Variables - Fatal编程技术网

Docker ASP.NET核心配置值有时在Kubernetes中返回空值

Docker ASP.NET核心配置值有时在Kubernetes中返回空值,docker,asp.net-core,kubernetes,environment-variables,Docker,Asp.net Core,Kubernetes,Environment Variables,我目前正在从事一个在Kubernetes上运行.NETCore2.1的项目。我的应用程序正在从appsettings.json文件和环境变量读取配置值 问题是,当我尝试从IConfiguration接口读取配置时,大多数时间值返回null,但仅在Kubernetes中返回。它在我的开发机器和带有Windows VM和IIS的测试机器上完美地工作。这些环境之间的区别在于开发和测试机器是Windows,但产品是基于microsoft/dotnet:2.1-aspnetcore-runtime映像和我

我目前正在从事一个在Kubernetes上运行.NETCore2.1的项目。我的应用程序正在从appsettings.json文件和环境变量读取配置值

问题是,当我尝试从IConfiguration接口读取配置时,大多数时间值返回null,但仅在Kubernetes中返回。它在我的开发机器和带有Windows VM和IIS的测试机器上完美地工作。这些环境之间的区别在于开发和测试机器是Windows,但产品是基于microsoft/dotnet:2.1-aspnetcore-runtime映像和我如何实现环境变量的linux容器上运行的Kubernetes。在我的开发机器中,没有定义环境变量。在Windows VM中,我确实通过以下web.config条目使用环境变量:

但当我从IConfiguration服务读取值并输出到控制台时,输出如下所示:

和其他重启

在这两次运行之间,我没有改变任何东西,它只是重新启动。它甚至没有读取appsettings.json中定义的默认值

那么你认为为什么会发生这种情况

编辑:

我使用这个代码块进行初始配置,CreateDefaultBuilder负责配置

公共静态IWebHostBuilder CreateWebHostBuilderstring[]args=> WebHost.CreateDefaultBuilderargs .UseStartup .添加预配置服务; 和CreateDefaultBinder的注释:

// //总结: //初始化Microsoft.AspNetCore.Hosting.WebHostBuilder的新实例 //使用预先配置的默认值初始化。 // //参数: //args: //命令行args。 // //返回: //已初始化的Microsoft.AspNetCore.Hosting.IWebHostBuilder。 // //备注: //以下默认值应用于返回的Microsoft.AspNetCore.Hosting.WebHostBuilder: //使用Kestrel作为web服务器,并使用应用程序的配置对其进行配置 //提供程序,设置Microsoft.AspNetCore.Hosting.IHostingEnvironment.ContentRootPath //要获得System.IO.Directory.GetCurrentDirectory的结果,请加载Microsoft.Extensions.Configuration.IConfiguration //从'appsettings.json'和'appsettings.[Microsoft.AspNetCore.Hosting.IHostingEnvironment.EnvironmentName].json', //在以下情况下从用户机密加载Microsoft.Extensions.Configuration.IConfiguration //Microsoft.AspNetCore.Hosting.IHostingEnvironment.Environment名称为“开发” //使用条目程序集,加载Microsoft.Extensions.Configuration.IConfiguration //从环境变量中加载Microsoft.Extensions.Configuration.IConfiguration //从提供的命令行参数中,配置Microsoft.Extensions.Logging.ILogger工厂 //要登录到控制台并调试输出,请启用IIS集成,并启用 //框架将其选项绑定到默认配置的能力 //部分。 公共静态IWebHostBuilder CreateDefaultBuilderstring[]参数; 编辑2:

在my Startup.cs中读取如下值:

services.addmvcopions=>{} .附加活页夹 .AddRazorOptions=> { 字符串主题=配置[站点:主题]; options.ViewLocationFormats.Clear; options.ViewLocationFormats.Add$~/Views/{theme}theme/{{{1}}/{{0}}.cshtml; options.ViewLocationFormats.Add$~/Views/{theme}theme/Shared/{{0}}.cshtml; } .SetCompatibilityVersionMicrosoft.AspNetCore.Mvc.CompatibilityVersion.Version_2_1;
经过漫长而艰难的调试过程。我终于可以找出问题所在了

.Net Core使用:作为配置键分隔符,但Kubernetes配置文件在命名环境变量时不支持此字符。EnvironmentVariablesConfigurationProvider通过接受_u作为分隔符并在读取值时替换为:来解决此问题

因此,我在Kubernetes部署文件中用_uu分隔符声明了我的环境变量,如上面所示。但是Dockerfile没有这个问题,我在下面用:separator编写环境定义,这会创建重复的变量,而.NETCore会读取所有变量,并创建不稳定的结果

ENV RemoteClient:HostUrl ${HOST_URL}
ENV RemoteClient:AppKey ${APP_KEY}
ENV RemoteClient:AppSecret ${APP_SECRET}
ENV ASPNETCORE_ENVIRONMENT ${ENVIRONMENT_NAME}

经过漫长而艰难的调试过程。我终于可以找出问题所在了

.Net Core使用:作为配置键分隔符,但Kubernetes配置文件在命名环境变量时不支持此字符。EnvironmentVariablesConfigurationProvider通过接受_u作为分隔符并在读取值时替换为:来解决此问题

因此,我在Kubernetes部署文件中用_uu分隔符声明了我的环境变量,如上面所示。但是Dockerfile没有这个问题,我在下面用:separator编写环境定义,这会创建重复的变量,而.NETCore会读取所有变量,并创建不稳定的结果

ENV RemoteClient:HostUrl ${HOST_URL}
ENV RemoteClient:AppKey ${APP_KEY}
ENV RemoteClient:AppSecret ${APP_SECRET}
ENV ASPNETCORE_ENVIRONMENT ${ENVIRONMENT_NAME}
你确认了吗
是否可以直接在容器中读取pod中的变量?我的意思是,尝试使用kubectl exec pod_name在te容器中配置变量-envIt的难以捕获失败的container to run命令。因为我试图在Startup.cs访问这些值,所以它会立即消失。但即使它不能从环境中正确读取,它也应该返回到appsettings.json源。您确认是否可以直接在容器中读取pod中的变量吗?我的意思是,尝试使用kubectl exec pod_name在te容器中配置变量-envIt的难以捕获失败的container to run命令。因为我试图在Startup.cs访问这些值,所以它会立即消失。但即使它无法从环境中正确读取,它也应该返回到appsettings.json源代码。感谢大家尝试解决此问题。感谢大家尝试解决此问题。