ASP.NET Core + Docker недоступен на указанном порту

Я не могу получить доступ к контейнеру с запущенным внутри приложением ASP.NET Core 3.1. Цель - запустить приложение в контейнере на порту 5000. Когда я запускаю его локально, используя стандартный профиль VS, я перехожу к http: // localhost: 5000 / swagger / index.html, чтобы загрузить swaggerUI. . Я хотел бы добиться того же с помощью докера.

Действия по воспроизведению моей проблемы:

  • Добавьте файл докеров с открытым портом 5000 и переменной ENV ASPNETCORE_URLS:

    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"]
    
  • Создать образ

     docker build -t myapp .
    
  • Запустить образ докера:

     docker run myapp -p 5000:5000
    

Выполнение приведенных выше команд с конкретным файлом докеров приводит к следующему:

    [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

Однако я не могу получить доступ к контейнеру с помощью http: // localhost: 5000 / swagger / index.html из-за ERR_CONNECTION_REFUSED - ›Этот сайт недоступен.

Я залез в контейнер, чтобы проверить, работает ли хост наверняка, используя:

docker exec -it containerId /bin/bash
cd /app
dotnet myapp.dll

что привело к следующей ошибке:

Unable to start Kestrel.
System.IO.IOException: Failed to bind to address http://[::]:5000: address already in use.

Вывод таков: порт внутри контейнера используется, приложение живое, просто не доступно извне, как попасть внутрь не знаю. Пожалуйста, укажите мне правильное направление.

ОБНОВЛЕНИЕ Проблема решена, ответ размещен ниже. Однако было бы неплохо объяснить, зачем это было нужно и как это работает!


person Kacper Kalinski    schedule 06.10.2020    source источник


Ответы (2)


Чтобы решить эту проблему, мне пришлось вручную добавить --server.urls в точку входа, как показано ниже:

ENTRYPOINT ["dotnet", "myapp.dll", "--server.urls", "https://+:5000"]
person Kacper Kalinski    schedule 07.10.2020

Я решил ту же проблему следующим образом:

  1. В appsettings.json добавлено следующее, чтобы заставить Kestrel прослушивать порт 80.
"Kestrel": {
  "EndPoints": {
    "Http": {
      "Url": "http://+:80"
    }
  }
}
  1. Выставил порт в dockerfile
ENV ASPNETCORE_URLS=http://+:80

EXPOSE 80

ENTRYPOINT ["dotnet", "EntryPoint.dll"]
  1. Запустите контейнер, используя следующую команду.
docker run -p 8080:80 <image-name>:<tag>
  1. Приложение представлено на http://localhost:8080/
person Sahitya    schedule 24.06.2021