ASP. net Базовое веб-приложение не получает запросы при работе в Docker контейнере - PullRequest
0 голосов
/ 07 января 2020

Я бы хотел dockerize простое ASP. net Базовое веб-приложение, в котором размещается REST API с использованием Kestrel.

Как видно из вывода консоли, приложение прекрасно работает, когда я запускаю его на локальном компьютере. Я вижу URL-адреса, по которым оно прослушивается, а также конечную точку, которую я вызвал, чтобы убедиться, что оно работает правильно:

> dotnet DockerTest.dll
> Hosting environment: Production
> Now listening on: https://localhost:5001
> Now listening on: http://localhost:5000
> Application started. Press Ctrl+C to shut down.
> info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://localhost:5000/api/values
...

Теперь к части docker:

My Dockerfile довольно просто. Я извлекаю базовый образ ASP. net Core, копирую вывод из dotnet publish "DockerTest.csproj" -c Release -o ./output и выполняю его так же, как я выполнил его на локальном компьютере:

Dockerfile:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
WORKDIR /app
COPY ./output .
ENTRYPOINT ["dotnet", "DockerTest.dll"]

После построения изображения с docker build -t dockertest . я использую привязку порта, а также переменную окружения ASPNETCORE_URLS, чтобы он работал на http://localhost:5000, чтобы он походил на мои локальные настройки:

docker run -p 5000:5000 -e ASPNETCORE_URLS="http://localhost:5000" dockertest

Вывод контейнера указывает что приложение прослушивает http://localhost:5000:

> Hosting environment: Production
> Content root path: C:\app
> Now listening on: http://localhost:5000
> Application started. Press Ctrl+C to shut down.

Но когда я пытаюсь получить доступ к конечной точке, я получаю timeout и контейнер никогда не получает запрос!

1 Ответ

1 голос
/ 07 января 2020

Ваша проблема вызвана тем, как вы указали ASPNETCORE_URLS. Вместо привязки к localhost необходимо прослушивать все сетевые интерфейсы , чтобы получать запросы, поступающие извне контейнера.

Это можно сделать, прослушивая 0.0.0.0 вместо localhost или с использованием подстановочного знака , например:

docker run -p 5000:5000 -e ASPNETCORE_URLS="http://+:5000"

В случае поддержки HTTP и HTTPS:

docker run -p 5000:5000 -p 5001:5001 -e ASPNETCORE_URLS="http://+:5000;https://+:5001"

Или когда используя порты по умолчанию:

docker run -p 5000:80 -p 5001:443 -e ASPNETCORE_URLS="https://+;http://+"

Мой предпочтительный подход заключается в использовании подстановочных URL-адресов и при необходимости перезаписи порта через явную переменную среды, например:

-p 5000:80 -p 5001:5001 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=5001
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...