来自 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 时出现“来自服务器的空回复”