#c# #docker #dockerfile
#c# #докер #докерфайл
Вопрос:
В настоящее время у меня есть приложение (.Net Core 3.1), которое прослушивает порт 40003. Теперь я пытаюсь поместить его в контейнер. Я создал файл dockerfile:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base WORKDIR /app EXPOSE 40003 FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build WORKDIR /src COPY ["myProject/myProject/myProject.csproj", "myProject/myProject/"] RUN dotnet restore "myProject/myProject/myProject.csproj" --configfile ./NuGet.Config COPY . . WORKDIR "/src/myProject/myProject" RUN dotnet build "myProject.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "myProject.csproj" -c Release -o /app/publish FROM base AS final ENV ASPNETCORE_URLS=http://*:40003 ENV ASPNETCORE_ENVIRONMENT="development" EXPOSE 40003 WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "myProject.dll"]
Как вы видите, я открыл порт 40003 и установил переменную ASPNETCORE_URLS. Я управляю этим:
docker run -it --rm --name myTag -p 40003:40003 myTag
Когда я вхожу в контейнер:
docker exec -it myTag bash
и выполнение:
wget http://localhost:40003
Я получил ожидаемый результат. Поэтому я верю, что мой компонент внутри контейнера жив и слушает Однако, когда я пытаюсь перейти к
http://localhost:40003
из моего локального браузера я получаю ERR_EMPTY_RESPONSE.
Можете ли вы дать несколько советов? Заранее спасибо.
Редактировать:===================
Я опубликовал полный файл docker. (добавлены первые 3 строки в файл docker, который определяет базу).
Да, я уверен, что я отправил сообщение на HTTP (не https).
http://localhost:40003 возвращает правильный ответ, который является пользовательским «selftest» При отсутствии разработки, если эта конечная точка заблокирована. Что-то вроде:
[HttpGet] [HttpPost] public JsonResultlt;DiagnosticsResultgt; ServerStatus()
Ответ: Я действительно не получил никакого ответа. Нет 200, 404 и т. Д. Просто ничего. Кроме того, сейчас я регистрирую этот результат самопроверки. Выше, когда я нахожусь в докере
INFORMATION 2021-11-30 09:15:48,738 [Omdc.SelfHost.Base.Tests.MinimumDiskSpaceTest.Run] MinimumDiskSpaceTest starting. INFORMATION 2021-11-30 09:15:48,741 [Omdc.SelfHost.Base.Tests.MinimumDiskSpaceTest.Run] Drive: /, Volume label: /, Total available space: 82%
Но когда я запрашиваю из локального браузера, нет ни журналов консоли, ни ответов HTTP. Поэтому моя просьба не достигать конечной точки (?)
Комментарии:
1. По-моему, это выглядит неплохо. Одна вещь, которую я заметил в вашем файле Dockerfile, заключается в том, что у вас есть
FROM base AS final
, но вы никогда не определяете, что такое базовое изображение. Вы опубликовали полный файл Dockerfile?2. ASP.NET Основные проекты веб-API по умолчанию используют HTTPS и перенаправляют HTTP-запросы на конечную точку HTTPS. Вы должны явно отключить HTTPS. Вы уверены
wget
, что подключаетесь только к HTTP и не перенаправляетесь на HTTPS?3. Используйте вкладку Сеть в инструментах разработчика браузера, чтобы узнать, что происходит и каков фактический ответ.
ERR_EMPTY_RESPONSE
это то, что отображает браузер, а не сам фактический ответ.4. @PanagiotisKanavos Он выдает предупреждение и возвращается к использованию http, когда в ASPNETCORE_URLS не определена конечная точка https
5. Еще одна вещь: поскольку вы создали приложение webapi, кажется странным, что вы ожидаете ответа на localhost:40003 . Я бы подумал, что вы бы указали конечную точку API с именем контроллера. Т. Е. для приложения webapi шаблона URL-адрес будет localhost:40003/weatherforecast .