我在MacOS的Docker容器中运行ASP.NET Core服务。
Visual Studio for Mac v18.1.2(内部版本2)
.NET Core SDK:2.2.300
这是Dockerfile:
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
WORKDIR /
COPY src/Services/Service.API/Service.API.csproj src/Services/Service.API/
RUN dotnet restore src/Services/Service.API/Service.API.csproj
COPY . .
WORKDIR /src/Services/Service.API
RUN dotnet build Service.API.csproj -c Release -o /app
FROM build AS publish
RUN dotnet publish Service.API.csproj -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Service.API.dll"]
以下是该服务的docker-compose文件的样子:
service.api:
build:
context: .
dockerfile: src/Services/Service.API/Dockerfile
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://+:80;https://+:443
- ASPNETCORE_HTTPS_PORT=5254
- ASPNETCORE_Kestrel__Certificates__Default__Password=crypticpassword
- ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx
ports:
- "5204:80"
- "5254:443"
volumes:
- ${HOME}/.aspnet/https:/https/
正在运行的Docker容器的端口也看起来不错:
0.0.0.0:5204-> 80 / tcp,0.0.0.0:5254->443/tcp
但是当我尝试致电https://localhost:5254时,它说无法访问该站点。
在输出中,我还会看到以下警告:
警告:Microsoft.AspNetCore.Server.Kestrel [0] 无法绑定至IPv6环回接口上的https://localhost:5001:“无法分配请求的地址”。 Microsoft.AspNetCore.Server.Kestrel:警告:无法绑定到 IPv6回送接口上的https://localhost:5001:“无法分配 要求的地址”。托管环境:开发内容根 路径:/ app现在正在收听:https://localhost:5001
为什么不使用ASPNETCORE_URLS环境变量设置的网址?
我还可以做些什么来进行故障排除以发现问题?
答案 0 :(得分:0)
首先,检查您的容器是否已启动并运行:
docker ps
如果正在运行,则可能无法启动容器内的Kestrel。您可能需要检查入口点,容器中的Linux区分大小写。在这种情况下,请尝试手动运行您的应用。首先,通过以下方式进入容器:
docker exec -it your_container /bin/bash
cd /app
dotnet yourprojectfile.dll
然后导航:
答案 1 :(得分:0)
我前一段时间遇到了您的问题,这就是我解决问题的方式。您需要将--server.urls
指定为运行参数,如下所示:
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Service.API.dll", "--server.urls", "http://+:80;https://+:443"]
5000
和5001
来自哪里?
Kestrel Endpoint configuration
默认情况下,ASP.NET Core绑定到:
https://localhost:5001(本地开发时 证书存在)
更新1:
根据docker-compose配置,您已将ASPNETCORE_ENVIRONMENT
设置为Development
。我认为您应该将其更改为Production
,因为启用Development
时ASP.NET Core
将从launchSettings.json
读取设置。
开发环境可以启用不应在生产中公开的功能。例如,ASP.NET Core模板在开发环境中启用“开发人员例外页面”。
可以在 项目的Properties \ launchSettings.json文件。环境价值 在launchSettings.json中设置的值将覆盖系统中设置的值 环境。
据我所记得,每个默认Kestrel
中80
的默认端口是443
和launchSettings.json
。
如果需要在Docker上以development
模式运行项目,则应在launchSettings.json
内更改配置,但我认为不建议这样做,最好将模式更改为Production
。 / p>
service.api:
build:
context: .
dockerfile: src/Services/Service.API/Dockerfile
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://+:80;https://+:443
- ASPNETCORE_HTTPS_PORT=5254
- ASPNETCORE_Kestrel__Certificates__Default__Password=crypticpassword
- ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx
ports:
- "5204:80"
- "5254:443"
volumes:
- ${HOME}/.aspnet/https:/https/
答案 2 :(得分:0)
对于您当前的docker-compose.yml
,您是直接引用现有映像service.api:${TAG:-latest}
,而不是使用dockerfile中生成的映像。
删除此行image: service.api:${TAG:-latest}
version: '3'
services:
service.api:
build:
context: .
dockerfile: src/Services/Service.API/Dockerfile
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://+:80;https://+:443
- ASPNETCORE_HTTPS_PORT=5254
- ASPNETCORE_Kestrel__Certificates__Default__Password=crypticpassword
- ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx
ports:
- "5204:80"
- "5254:443"
volumes:
- ${HOME}/.aspnet/https:/https/
答案 3 :(得分:0)
结果证明这是Visual Studio for Mac v18.1.2中的一个错误(docker编写了作品)
答案 4 :(得分:0)
基本上,在 asp.net 核心代码中,它只侦听 Container 中的 localhost,而不侦听您的本地 pc。您可以通过更新设置以侦听“http://*:5000”而不是“http://localhost:5000”来解决此问题。
这里详细说明原因和解决方法。 https://stackoverflow.com/a/65953771/8918445