来自 docker-compose 的 ASPNETCORE_URLS 没有覆盖 appsetting.production.json

Posted

技术标签:

【中文标题】来自 docker-compose 的 ASPNETCORE_URLS 没有覆盖 appsetting.production.json【英文标题】:ASPNETCORE_URLS from docker-compose did not override appsetting.production.json 【发布时间】:2022-01-17 19:17:37 【问题描述】:

我用 compose-up 配置了我的 Asp.Net 核心项目。

网页部分如下:

    server:
        container_name: 'server'
        image: 'mcr.microsoft.com/dotnet/aspnet:5.0'
    #    restart: always
        working_dir: '/app'
        ports: 
            - "8886:80"
            - "8887:443"
        volumes: 
            - 'C:/Users/xx/Docker/meekou-server/:/app'
            - 'C:\Users\xx\Docker\meekou-certificates\https:/https/'
        environment: 
            - ASPNETCORE_ENVIRONMENT=Production
            - ASPNETCORE_URLS=http://+:80
            - ASPNETCORE_Kestrel__Certificates__Default__Password=test
            - ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx
        entrypoint: 
            ["dotnet", "xx.Web.Host.dll"]           
        depends_on: 
            - meekou-mysql

还有来自appsettings.Production.json的配置

  "Kestrel": 
    "Endpoints": 
      "Http": 
        "Url": "http://+:809"
      
    
  ,

使用compose-up,asp.net 内核总是在 809 下监听。

有什么原因,docker-compose 文件没有覆盖 appsettings.Production.json 中的设置吗?

【问题讨论】:

【参考方案1】:

appsettings.Production.json 中的配置优先于ASPNETCORE_URLS 环境变量。更具体地说,Kestrel 部分中的配置会覆盖 Urls 配置设置。

如果您使用ASPNETCORE_KESTREL__ENDPOINTS__HTTP__URL 环境变量覆盖代表您在appsettings.Production.json 中配置的Kestrel 端点的配置键,它会起作用:

environment: 
    - ASPNETCORE_ENVIRONMENT=Production
    - ASPNETCORE_KESTREL__ENDPOINTS__HTTP__URL=http://+:80

【讨论】:

通常环境变量优先于配置文件设置。你知道为什么这里不是这样吗? @HansKilian 这不是关于配置源覆盖其他源,而是更多关于 Kestrel 更喜欢“端点”键而不是更高级别的“urls”键。源代码中有一个测试证明了这个here。你可以通过AddressBinder.BindAsync 方法来了解它的工作原理。 @KirkLarkin 我在.net 5 下用ASPNETCORE_KESTREL__ENDPOINTS__HTTP__URL 进行了测试,看来它不起作用。恐怕我需要修改appsettings.Production.json 这很不寻常。我在发布答案之前对其进行了测试,效果很好。

以上是关于来自 docker-compose 的 ASPNETCORE_URLS 没有覆盖 appsetting.production.json的主要内容,如果未能解决你的问题,请参考以下文章

docker-compose 连接来自 LAN 上不同设备的服务器/客户端容器

可以将来自docker-compose.yml的env变量传递给dockerfile吗?

来自 docker-compose 的 ASPNETCORE_URLS 没有覆盖 appsetting.production.json

尝试在运行 docker-toolbox 的 Windows 上使用 docker-compose 在 docker 容器内运行 webpack-dev-server 时出现“来自服务器的空回复”

docker-compose 未定义的 process.env

没有来自 docker 容器的 php-fpm 错误日志