ASP.NET Core WebAPI启动URL差异:Docker Compose vs Docker Build
.NET 6 WebAPI在Docker Compose与Docker Build构建下的K8s启动行为差异
环境
- Minikube v1.26.1
- Docker Desktop v4.12
- Docker Compose v2.10.2
使用Docker Compose构建
因需读取父目录文件,将构建上下文设为父目录,docker-compose.yml配置如下:
version: "3.8" services: web.api: build: context: ./../ dockerfile: ./web.API/Dockerfile
对应的Dockerfile内容:
FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build WORKDIR /src ENV ASPNETCORE_URLS=http://+:80 COPY Directory.Build.props ./Directory.Build.props COPY .editorconfig ./.editorconfig COPY ["webapi/web.API", "web.API/"] RUN dotnet build "web.API/web.API.csproj" -c Release --self-contained true --runtime alpine-x64 RUN dotnet publish "webapi/web.API.csproj" -c Release -o /app/publish \ --no-restore \ --runtime alpine-x64 \ --self-contained true \ /p:PublishSingleFile=true FROM mcr.microsoft.com/dotnet/runtime-deps:6.0-alpine WORKDIR /app EXPOSE 80 EXPOSE 443 COPY --from=build /app/publish . ENTRYPOINT ["./web.API"]
此构建方式下,应用部署到K8s集群后的启动日志:
Now listening on: http://[::]:80
使用Docker Build构建
使用与上述完全相同的Dockerfile和构建上下文,应用部署到K8s后的启动日志:
Now listening on: http://localhost:5000
本地运行镜像
将K8s集群中的镜像拉取到本地运行,日志显示:
Now listening on: http://[::]:80
已尝试方案
- 在Dockerfile中设置
ASPNETCORE_URLS环境变量,无法改变启动URL - 在K8s deployment.yml中配置该环境变量,同样无效,暂未明确差异产生的原因
更新
目前唯一有效的解决方法是在Program.cs中添加以下代码强制指定监听地址:
builder.WebHost.ConfigureKestrel(option =>{ option.ListenAnyIP(80); });
但仍未明确两种构建方式导致启动行为差异的根本原因。
内容的提问来源于stack exchange,提问作者greenhoorn
相关产品推荐
相关产品推荐

