.NET Core 3.1 覆盖 docker compose 中的自定义值

Posted

技术标签:

【中文标题】.NET Core 3.1 覆盖 docker compose 中的自定义值【英文标题】:.NETCore 3.1 override custom value in 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 无法正常工作,则无法正常工作

【问题讨论】:

【参考方案1】:

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

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

最好的问候, 丹尼尔

【讨论】:

有效!我有第二个问题,因为我在 main 上添加了 JsonProvider,但在删除它并添加 Env 变量后一切正常。谢谢

以上是关于.NET Core 3.1 覆盖 docker compose 中的自定义值的主要内容,如果未能解决你的问题,请参考以下文章

C# 和 Docker - 无法从容器化 .NET Core 3.1 Web API 连接到容器化 MySQL 服务器

C# .NET Core 3.1 无法建立 SSL 连接

。NET Core 3.1 gRPC Docker:无法使原型路径相对

从.NET Core 3.1(Docker)迁移后,.NET 6 应用程序日志为 JSON 格式 [重复]

路由覆盖在 asp.net core 3.1 剃须刀页面中不起作用

如何使用 Visual Studio 2019 在 Docker 容器中运行 ASP.NET Core 3.1 项目?