Я пытаюсь настроить свой ASP.NET Core 8.0 Web API
для работы с Heroku с помощью контейнера Docker.
И на Heroku, и на Docker это не работает, и я не могу понять, почему.
Однако когда я запускаю его вне докера и локально на своем компьютере, он работает localhost:5000
. Кто-нибудь может мне помочь?
Это мой Dockerfile:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["Onitama.Api/Onitama.Api.csproj", "Onitama.Api/"]
COPY ["Onitama.Core/Onitama.Core.csproj", "Onitama.Core/"]
COPY ["Onitama.Bootstrapper/Onitama.Bootstrapper.csproj", "Onitama.Bootstrapper/"]
COPY ["Onitama.Infrastructure/Onitama.Infrastructure.csproj","Onitama.Infrastructure/"]
RUN dotnet restore "Onitama.Api/Onitama.Api.csproj"
COPY . .
WORKDIR "/src/Onitama.Api"
RUN dotnet build "Onitama.Api.csproj" -c $BUILD_CONFIGURATION -o /app/build
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "Onitama.Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
CMD ASPNETCORE_URLS=http://+:$PORT dotnet Onitama.Api.dll
Консоль:
Как вы можете видеть, CMD правильно распознает переменную среды $PORT
, но на самом деле не может работать на этом порту...
Есть ли у кого-нибудь идеи, что происходит?
Обновлено:
Я удалил точку входа, как предложено ниже, и получаю следующее:
2024-05-23T20:42:57.675131+00:00 app[web.1]: warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3]
2024-05-23T20:42:57.675135+00:00 app[web.1]: Failed to determine the https port for redirect.
РЕШЕНО: Удалив точку входа в файле Dockerfile и отключив перенаправление https в моем приложении asp net, я смог заставить все работать! Кажется, что браузер по-прежнему использует https, потому что на Heroku включена автоматическая аутентификация SSL, которая, как я предполагаю, делает всю работу за меня.
Пожалуйста, не размещайте изображения текста. Вставьте текст в свое сообщение и используйте инструменты форматирования, чтобы отделить содержимое файла от текста. Мне бы очень хотелось показать вам работающий Dockerfile, но я не собираюсь вводить весь этот текст вручную.
Ваша проблема в том, что ENTRYPOINT и CMD объединяются в одну команду при запуске вашего контейнера. В конечном итоге ваша программа запускается без оболочки, как указано в ENTRYPOINT. Затем ваш CMD передается в вашу программу в качестве параметров. Ваша программа, вероятно, не ожидает параметров, поэтому просто игнорирует их.
Чтобы это исправить, удалите оператор ENTRYPOINT. Тогда ваш CMD будет запущен в оболочке, как вы и ожидаете, и будет установлена переменная среды.
Просто вопрос... После изменения Dockerfile, как было предложено, на этот раз он, похоже, действительно запустился. За исключением того, что теперь я получаю следующее, что не совсем понимаю (отредактированное сообщение более понятно): Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3] Не удалось определить порт https для перенаправления. Есть идеи, в чем может быть проблема? Спасибо за предыдущий ответ :)
Ваш ASPNETCORE_URLS указывает только порт HTTP, поэтому, если вы настроили ASP для перенаправления на HTTPS, он не сможет найти порт. Если вам не нужен HTTPS, вы можете удалить UseHttpsRedirection
в своей программе.
Аааа! Спасибо за ответ, и прошу прощения. Я обязательно отредактирую и использую код в сообщении.