【问题标题】:.NETCore 3.1 override custom value in docker compose.NET Core 3.1 覆盖 docker compose 中的自定义值
【发布时间】:2021-11-03 10:48:39
【问题描述】:

我正在开发 .net core 3.1 服务工作者。我已经创建了一个 docker 模板,并且能够创建和启动我的容器。所以现在我需要在端口 1111 和端口 2222 上创建相同服务 1 的 2 个副本。

我的 appsettings.json 有一个变量

{
....
  Service : 
  {
   Port: "1111"
  }

如果我启动从 appsettings.json 读取的第一个容器并且端口设置为 1111,那么现在我需要覆盖端口。我创建了一个撰写文件:

version: '3.4'

services:
  broker:
    environment:
          SERVICE__PORT: 9999
    image: ${DOCKER_REGISTRY-}service1
    build:
      context: .
      dockerfile: service1\Dockerfile
    volumes: 
      - ./Settings/appsettings.docker.json:c:/app/appsettings.json
      - ./Logs:c:/app/logs

但没有变量覆盖。我添加了

FROM  mcr.microsoft.com/dotnet/sdk:3.1

WORKDIR /app
ENV SERVICE__PORT=1234

COPY . .

ENTRYPOINT ["dotnet", "service1.dll"]

如果我调试我的代码,我会看到很多关闭提供程序,而在 EviromentSet 上我会看到我的 var。 在 CreateHostBuilder 上,我添加了一些部分来添加登录


            host.ConfigureLogging(
                loggingBuilder =>
                {
                    loggingBuilder.ClearProviders();
                    var configuration = new ConfigurationBuilder()
                        .AddJsonFile("appsettings.json")
                        .Build();
                    var loggerConfig = new LoggerConfiguration()
                        .ReadFrom.Configuration(configuration);


                    var logger = loggerConfig.CreateLogger();
                    loggingBuilder.AddSerilog(logger, dispose: true);
                }
            ); 

当我的服务启动时,我尝试通过配置服务获取价值

 public Worker(ILogger<Worker> logger, IConfiguration configuration)
        {
            _logger = logger;
            _configuration = configuration;
        }

...
 private async Task StartServer()
        {
            
            try
            {

....
                var port = _configuration["Service:Port"] == ""
                    ? 9876
                    : Convert.ToInt32(_configuration["Service:Port"]);
....
}

我也尝试通过 compose 挂载卷,但如果我通过 -v 开关运行 docker 命令但从 VS2019 无法正常工作,则无法正常工作

【问题讨论】:

    标签: c# docker .net-core docker-compose


    【解决方案1】:

    要支持使用环境变量覆盖 appsettings,您必须在创建主机构建器时启用环境变量支持。

    var configuration = new ConfigurationBuilder()
                            .AddJsonFile("appsettings.json")
                            .AddEnvironmentVariables()
                            .Build();
    

    最好的问候, 丹尼尔

    【讨论】:

    • 有效!我有第二个问题,因为我在 main 上添加了 JsonProvider,但在删除它并添加 Env 变量后一切正常。谢谢
    猜你喜欢
    • 2021-05-02
    • 2020-07-08
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多