【问题标题】:ASP.NET Core Docker Container App not accessibleASP.NET Core Docker 容器应用程序无法访问
【发布时间】:2019-11-05 16:40:42
【问题描述】:

我在 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 环境变量设置的 url?

我还能做些什么来排除故障以找到问题?

【问题讨论】:

    标签: docker asp.net-core https


    【解决方案1】:

    首先,检查您的容器是否已启动并运行:

    docker ps

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

    docker exec -it your_container /bin/bash

    cd /app

    dotnet yourprojectfile.dll

    然后导航:

    https://localhost:5254

    【讨论】:

    • 容器已启动并正在运行。关于入口点,我在问题中添加了 Dockerfile
    • 你检查过红隼吗?它也在运行吗?
    • 如何在容器中检查?
    • 随便docker exec -it your_container /bin/bash
    • 或者docker logs your_container,如果你想按照日志使用:docker logs -f your_container语法
    【解决方案2】:

    我之前遇到过你的问题,我就是这样解决的。您需要将--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 Endpoint configuration

    默认情况下,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 模板在开发环境中启用了开发人员异常页面。

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

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

    如果您需要在 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 我明白了,我更新了答案,请看一下。
    【解决方案3】:

    对于您当前的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 合并 docker-compose.yam 和 docker-compose.override.yml 是什么意思?运行docker container -ls -a查看是否有镜像名称为service.api的容器,删除它们并再次运行docker-compose up。不确定您是否在任何地方进行了配置,尝试将此 dockerfile 和 docker-compose 与新的默认 .net 核心项目一起使用。
    【解决方案4】:

    原来这是 Visual Studio for Mac v18.1.2 中的一个错误(docker-compose up 工作)

    【讨论】:

    • 在 Windows 10 上使用 docker 桌面和 linux 容器也无法访问...
    【解决方案5】:

    基本上,在 asp.net 核心代码中,它只监听 Co​​ntainer 中的 localhost,而不是你的本地 pc。您可以通过将设置更新为侦听“http://*:5000”而不是“http://localhost:5000”来解决此问题。

    这里详细解释了原因和解决方法。 https://stackoverflow.com/a/65953771/8918445

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      • 2015-11-22
      • 2021-11-07
      相关资源
      最近更新 更多