ASP.NET Core Docker容器应用程序无法访问。

5
我可以帮助您翻译。这是关于在MacOS上在Docker容器中运行ASP.NET Core服务的信息。
使用的工具为Visual Studio for Mac v18.1.2 (build 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 时,它显示网站无法访问。

此外,在输出中我看到以下警告:

warn: Microsoft.AspNetCore.Server.Kestrel[0] 无法绑定到 IPv6 回环接口上的 https://localhost:5001:'无法分配请求的地址'。 Microsoft.AspNetCore.Server.Kestrel:Warning: 无法绑定到 IPv6 回环接口上的 https://localhost:5001:'无法分配请求的地址'。托管环境: 开发 内容根路径: /app 现在正在侦听: https://localhost:5001

为什么 ASPNETCORE_URLS 环境变量设置的 URL 无法生效?
还有哪些故障排除方法可以使用来找到问题?
6个回答

5
我之前也遇到了你这个问题,以下是我如何解决的方法。你需要像下面这样指定--server.urls作为运行参数:
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Service.API.dll", "--server.urls", "http://+:80;https://+:443"]

50005001 是从哪里来的?

Kestrel终端点配置

默认情况下,ASP.NET Core绑定到:

http://localhost:5000

https://localhost:5001 (当本地开发证书存在时)

更新1:

根据你的docker-compose配置,你已经将 ASPNETCORE_ENVIRONMENT 设置成了 Development。我认为你应该把它改成 Production,因为当你启用了 Development 时,ASP.NET Core 将会读取 launchSettings.json 中的设置。

开发环境可以启用在生产环境中不应暴露的功能,例如 ASP.NET Core 模板会在开发环境中启用 Developer Exception Page。

本地机器开发环境可以在项目的 Properties\launchSettings.json 文件中进行设置。在 launchSettings.json 中设置的环境值将覆盖系统环境中设置的值。

据我所记,Kestrel 的默认端口是每个默认 launchSettings.json 中的 80443

如果你需要在 Docker 上以 development 模式运行项目,你应该改变 launchSettings.json 中的配置,但我认为这不是推荐做法,最好还是将模式改为 Production

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/

谢谢,但这没有帮助。同样的问题。根据您提供的链接,可以使用ASPNETCORE_URLS环境变量,我也是这么做的,但它似乎忽略了它并使用默认绑定。 - Palmi
@Palmi 我明白了,我更新了答案,请看一下。 - Ali Bahrami

2

首先,使用以下命令检查容器是否正在运行:

docker ps

如果它正在运行,则容器内的Kestrel可能没有启动。您可能需要检查入口点,容器中的Linux区分大小写。在这种情况下,请尝试手动运行应用程序。首先通过以下命令进入容器:

docker exec -it your_container /bin/bash

cd /app

dotnet yourprojectfile.dll

然后导航到:

https://localhost:5254

“Original Answer”翻译成中文是“最初的回答”。


容器已经启动运行。关于入口点,我在我的问题中添加了Dockerfile。 - Palmi
你检查了Kestrel吗?它也在运行吗? - nPcomp
如何在容器中进行检查? - Palmi
只需执行 docker exec -it your_container /bin/bash - nPcomp
如果您想要查看日志,请使用以下语法:docker logs -f your_container。或者,如果您只是想查看日志,则可以使用docker logs your_container - nPcomp
dotnet Service.API.dll在容器中返回:您是否想要运行dotnet SDK命令?请从以下链接安装dotnet SDK: https://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409 - Palmi

1
基本上,在asp.net core的代码中,它只监听容器中的本地主机,而不是您的本地计算机。您可以通过将设置更新为监听"http://*:5000"而不是"http://localhost:5000"来解决此问题。
以下是原因和解决方案的详细说明。 https://stackoverflow.com/a/65953771/8918445

0
原来这是Visual Studio for Mac v18.1.2的一个bug(docker-compose up可以正常工作)。

在Windows 10上使用Docker桌面版和Linux容器也无法访问... - NyoNor

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/

我在我的问题中删除了它。我只是尝试合并docker-compose.yml和docker-compose.override.yml以简化问题... - Palmi
@Palmi,您所说的合并docker-compose.yaml和docker-compose.override.yml是什么意思?运行“docker container -ls -a”命令查看是否有镜像名称为“service.api”的容器,如果有,请删除它们,然后再次运行“docker-compose up”。不确定您是否进行了任何配置,请尝试使用此Dockerfile和Docker Compose与新的默认.NET Core项目。 - Edward

0
在我的情况下,当使用*(星号)代替localhost时,一切正常(urls=http://*:5000而不是urls=http://localhost:5000)。
在Dockerfile中使用以下代码(在您的项目发布目录的父目录中创建名为"Dockerfile"的文件)
FROM mcr.microsoft.com/dotnet/sdk:5.0
WORKDIR /App
COPY ./your project publish folder/ .
ENTRYPOINT ["tail", "-f", "/dev/null"]
ENTRYPOINT ["dotnet", "myproject.dll","urls=http://*:5000"]

然后构建和生成Docker镜像文件:
sudo docker build -t mydockerimage:0.3 .

然后将项目作为Docker容器运行:
docker run -it  -td -p 5000:5000 mydockerimage:0.3

然后你可以使用curl命令测试网站。
curl localhost:5000

你可以使用这个命令来查看你的网站日志:
docker container logs "your containr ids"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接