将 docker 环境变量传递给 .net core

App*_*per 5 c# docker asp.net-core

我已经关注了这篇文章,但github上的代码无法编译,我认为教程已经过时了。( Configuration = builder.Build();) 抛出错误。那么如何访问从 docker 传递过来的 env 呢?


docker-compose

  myproj:
    image: mcr.microsoft.com/dotnet/core/sdk:2.2
    restart: on-failure
    working_dir: /MyProj
    command: bash -c "dotnet build MyProj.csproj && dotnet bin/Debug/netcoreapp2.2/MyProj.dll"
    ports:
      - 5001:5001
      - 5000:5000
    volumes:
      - "./MyProj:/MyProj"
    environment:
      DATABASE_HOST: database
      DATABASE_PASSWORD: Password
Run Code Online (Sandbox Code Playgroud)

启动文件

public Service()
{
    Environment.GetEnvironmentVariable("DATABASE_PASSWORD"); // null
}

// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.Run(async (context) =>
    {
        context.Response.WriteAsync("Hello World!");
    });
}
Run Code Online (Sandbox Code Playgroud)

Ver*_* C. 15

IConfiguration您可以读取默认情况下为您完成的所有值。如果您已在 中使用默认值配置主机Program.cs,那么它将按以下顺序加载配置

  1. 应用程序设置.json
  2. 应用程序设置..json
  3. 秘密.json
  4. 环境变量
  5. 命令行参数

例如,你可以上一堂课

    public class DatabaseSettings
    {
        public string Host { get; set; }
        public string Password { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

然后Startup.cs您可以读取这些值并将它们绑定到一个DatabaseSettings对象。

var credentials = Configuration.GetSection("Database").Get<DatabaseSettings>();

注意:您的环境变量必须使用双下划线来分隔键和值部分。

例如,如果您要从文件appsettings.jsonappsettings.Development.json文件传递此层次结构JSON对象

  "Database": {
    "Host": "address",
    "Password": "password" 
  }
Run Code Online (Sandbox Code Playgroud)

也可以像这样展平时表示

"Database:Host":"address",
"Database:Password":"Password"
Run Code Online (Sandbox Code Playgroud)

或者当作为环境变量传递时可以这样做

Database__Host=address
Database__Password=password
Run Code Online (Sandbox Code Playgroud)

请记住,您需要双下划线。


Sou*_*jee 13

在 .NET Core 应用程序中访问环境变量的标准方法是使用静态方法

public static string GetEnvironmentVariable (string variable);
Run Code Online (Sandbox Code Playgroud)

因此,在您的情况下,无论您在 docker run 命令中或通过启动设置文件传递什么,都只需使用此方法。作为获取数据库密码的示例,请使用此

string dbPassword = Environment.GetEnvironmentVariable("DATABASE_PASSWORD");
Run Code Online (Sandbox Code Playgroud)

此外,请务必通过添加以下行来定义 dockerfile 的环境变量部分

ENV DATABASE_PASSWORD some_default_value_or_can_be_empty
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。您可以使用 .NET Core 2.1 及更高版本中的“EnvironmentVariablesConfigurationProvider”将环境变量注入到“IConfiguration”中,这一点也毫无价值。更多信息:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1#environment-variables-configuration-provider (2认同)
  • 对我来说也是如此,我尝试使用“docker run -e”和“docker run --env-file”传递环境变量,并在代码中获取 null 。我尝试打印我的 .net core 3.1 应用程序在容器中可以访问的所有环境变量,但我只能看到“ASPNETCORE_URLS、DOTNET_RUNNING_IN_CONTAINER、PATH、HOSTNAME、HOME 和 PATH”,但看不到我的自定义环境变量... (2认同)
  • 如果你想使用 -e 传递环境变量,你需要使用该语法: `docker run -ti -e "RemoteIp=1.23.4.56" myImageTag` (2认同)
  • 顺序或论据很重要。因此,如果您使用命令行参数,请尝试将其移至末尾,看看是否有帮助。 (2认同)

小智 7

您可以在构建参数中传递 env 变量。例如

--build-arg ASPNETCORE_ENVIRONMENT=Development
Run Code Online (Sandbox Code Playgroud)

使用以下变量设置值:

ASPNETCORE_ENVIRONMENT

代码:

var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
Run Code Online (Sandbox Code Playgroud)

您可以在环境名称的代码中使用上述变量。