ASP.NET Core + Docker 无法在指定端口上访问

Kal*_*lik 5 containers kestrel docker asp.net-core

我无法访问其中运行 ASP.NET Core 3.1 应用程序的容器。目标是在端口 5000 上的容器中运行应用程序。当我使用标准 VS 配置文件在本地运行它时,我导航到http://localhost:5000/swagger/index.html以加载 swaggerUI。我想使用 docker 实现同样的事情。

重现我的问题的步骤:

  • 添加带有公开的5000端口和ENV ASPNETCORE_URLS 变量的 dockerfile:

    FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base
    WORKDIR /app
    ENV ASPNETCORE_URLS=http://+:5000
    EXPOSE 5000
    
    FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
    WORKDIR /src
    COPY ["myapp/myapp.csproj", "myapp/"]
    RUN dotnet restore "myapp/myapp.csproj"
    COPY . .
    WORKDIR "/src/myapp/"
    RUN dotnet build "myapp.csproj" -c Release -o /app/build
    
    FROM build AS publish
    RUN dotnet publish "myapp.csproj" -c Release -o /app/publish
    
    FROM base AS final
    WORKDIR /app
    COPY --from=publish /app/publish .
    ENTRYPOINT ["dotnet", "myapp.dll"]
    
    Run Code Online (Sandbox Code Playgroud)
  • 打造形象

     docker build -t myapp .
    
    Run Code Online (Sandbox Code Playgroud)
  • 运行docker镜像:

     docker run myapp -p 5000:5000
    
    Run Code Online (Sandbox Code Playgroud)

使用特定的 docker 文件运行上面的命令会产生以下结果:

    [21:28:42 INF] Starting host.
    [21:28:42 INF] Now listening on: http://[::]:5000
    [21:28:42 INF] Application started. Press Ctrl+C to shut down.
    [21:28:42 INF] Hosting environment: Production
    [21:28:42 INF] Content root path: /app
Run Code Online (Sandbox Code Playgroud)

但是,我无法使用 http://localhost:5000/swagger/index.html 访问容器,因为 ERR_CONNECTION_REFUSED -> 无法访问此站点。

我确实进入容器来检查主机是否正在运行,使用:

docker exec -it containerId /bin/bash
cd /app
dotnet myapp.dll
Run Code Online (Sandbox Code Playgroud)

是什么导致了以下错误:

Unable to start Kestrel.
System.IO.IOException: Failed to bind to address http://[::]:5000: address already in use.
Run Code Online (Sandbox Code Playgroud)

结论是容器内的端口已使用,应用程序处于活动状态,只是无法从外部访问。我不知道如何进入其中。请指出我正确的方向。

更新 问题已解决,答案发布在下面。不过,解释一下为什么需要它以及它是如何工作的会很好!

Kal*_*lik 6

为了解决这个问题,我必须手动将“--server.urls”添加到入口点,如下所示:

ENTRYPOINT ["dotnet", "myapp.dll", "--server.urls", "https://+:5000"]
Run Code Online (Sandbox Code Playgroud)