配置Caddyfile与ASP.NET Core9+Angular本地HTTPS时访问失败排查
ASP.NET Core + Angular 容器部署访问异常排查
项目创建步骤
mkdir <solution_name> cd <solution_name> dotnet new sln --name <solution_name> mkdir src cd src dotnet new angular -n App # 以下为Visual Studio操作 打开<solution_name>解决方案 右键创建名为src的新文件夹 右键点击src,添加现有项目App
配置文件内容
CaddyDockerfile
FROM caddy:latest COPY Caddyfile /etc/caddy/Caddyfile
Caddyfile
{ local_certs } app.localhost { reverse_proxy penaltycancellationformui:5001 }
docker-compose.yml(已手动创建并信任本地证书)
services: penaltycancellationformui: image: ttcuipenaltycancellationform:dev build: context: . # 根目录路径(相对docker-compose.yml) dockerfile: Dockerfile # 相对构建上下文路径 networks: - caddy-net environment: - ASPNETCORE_Kestrel__Certificates__Default__Password=mysuperpassword - ASPNETCORE_Kestrel__Certificates__Default__Path=/https/ttcuipenaltycancellationform.pfx volumes: - ${USERPROFILE}/.aspnet/https:/https/ caddy: image: caddy:dev build: context: . dockerfile: CaddyDockerfile ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile - caddy_data:/data networks: - caddy-net depends_on: - penaltycancellationformui networks: caddy-net: volumes: caddy_data:
Dockerfile
# Stage 1: Build Angular App FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base # 不安装node # Stage 2: Build .NET Application FROM mcr.microsoft.com/dotnet/sdk:9.0 AS dotnet-build RUN apt-get update && apt-get install -y nodejs npm WORKDIR /src COPY App.csproj . RUN dotnet restore COPY . . # Stage 3: Publish .Net FROM dotnet-build AS dotnet-publish RUN dotnet publish -c Release -o /app # Stage 4: Combine Angular and .NET for Deployment FROM base AS final WORKDIR /app ENV ASPNETCORE_URLS=https://+:5001;http://+:5000 COPY --from=dotnet-publish /app . ENTRYPOINT ["dotnet", "App.dll"]
问题现象
执行docker compose up -d后,容器创建成功,但访问app.localhost无法加载内容。
Caddy错误日志
{"level":"error","ts":1745422772.0373719,"logger":"http.log.error","msg":"EOF","request":{"remote_ip":"172.23.0.1","remote_port":"54724","client_ip":"172.23.0.1","proto":"HTTP/2.0","method":"GET","host":"app.localhost","uri":"/","headers":{"Sec-Fetch-Mode":["navigate"],"Sec-Fetch-Dest":["document"],"Sec-Ch-Ua":["\"Not(A:Brand\";v=\"99\", \"Google Chrome\";v=\"133\", \"Chromium\";v=\"133\""]},"Sec-Fetch-Site":["none"],"Accept-Encoding":["gzip, deflate, br, zstd"],"Accept-Language":["en-US,en;q=0.9"],"Sec-Ch-Ua-Mobile":["?0"],"Sec-Ch-Ua-Platform":["\"Windows\""]},"Upgrade-Insecure-Requests":["1"],"Sec-Fetch-User":["?1"],"Priority":["u=0, i"],"Cache-Control":["max-age=0"],"User-Agent":["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36"],"Accept":["text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"]},"tls":{"resumed":false,"version":772,"cipher_suite":4865,"proto":"h2","server_name":"app.localhost"}},"duration":0.037247804,"status":502,"err_id":"ahwzwi12f","err_trace":"reverseproxy.statusError (reverseproxy.go:1390)"}
容器端口状态
执行docker compose ps发现app-penaltycancellationformui-1容器未暴露定义的5000和5001端口:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS app-caddy-1 caddy:dev "caddy run --config …" caddy 6 seconds ago Up 6 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 443/udp, 2019/tcp app-penaltycancellationformui-1 ttcuipenaltycancellationform:dev "dotnet App.dll" penaltycancellationformui 7 seconds ago Up 6 seconds
请问我遗漏了什么配置?
内容的提问来源于stack exchange,提问作者Hoang Minh
相关产品推荐
相关产品推荐

