Не удалось развернуть приложение dockerized ASP .netcore 3.1 на heroku, но контейнер работает на локальном компьютере. - PullRequest
2 голосов
/ 18 января 2020

Я искал несколько дней, чтобы найти свое решение, но я просто не могу его найти.

Обзор: Я строю Asp. net Core (3.1) приложение, которое я настроил для работы на docker. Моя цель - развернуть его на heroku.

Проблема: Я могу заставить его работать на локальном компьютере, чтобы попытаться запустить контейнер docker, но когда я разверну его на heroku (образ был создан без проблем) я получаю сообщение об ошибке:

" Ошибка приложения В приложении произошла ошибка, и ваша страница не может быть обработана. Если вы являетесь владельцем приложения, проверьте подробности в своих журналах. Это можно сделать из интерфейса командной строки Heroku с помощью команды "

Настройка

Heroku:

Код

Dockerfile


WORKDIR /src
COPY *.sln .
COPY Ecomm.UnitTests/*.csproj Ecomm.UnitTests/
COPY Ecomm.Api/*.csproj Ecomm.Api/
RUN dotnet restore
COPY . .

# testing
FROM build AS testing
WORKDIR /src/Ecomm.Api
RUN dotnet build
WORKDIR /src/Ecomm.UnitTests
RUN dotnet test

# publish
FROM build AS publish
WORKDIR /src/Ecomm.Api
RUN dotnet publish -c Release -o /src/publish



FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
WORKDIR /src
COPY --from=publish /src/publish .
# heroku uses the following
CMD ASPNETCORE_URLS=http://*:$PORT dotnet Ecomm.Api.dll

Program.cs (скрипт по умолчанию)

public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }

Startup.cs (скрипт по умолчанию)

public class Startup 
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }

Launchsettings. json

    "Ecomm.Api": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "/weatherforecast",
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Production"
      }
    }

Сравнение между выполнением контейнера локально и развертыванием герою

Локальный интерфейс

Интерфейс Heroku

методы, используемые для pu sh в регистре контейнера Heroku:

  docker login --username=_ --password=$HEROKU_API_KEY registry.heroku.com
  heroku container:push api -a $HEROKU_APP_NAME --recursive 
  heroku container:release api -a $HEROKU_APP_NAME

Журналы ошибок в heroku:

2020-01-18T14:53:32.255720+00:00 heroku[api.1]: State changed from crashed to starting

2020-01-18T14:53:35.853732+00:00 heroku[api.1]: Starting process with command `/bin/sh -c ASPNETCORE_URLS\=http://\*:\59573\ dotnet\ Ecomm.Api.dll`

2020-01-18T14:53:36.494742+00:00 heroku[api.1]: State changed from starting to up

2020-01-18T14:53:37.754733+00:00 app[api.1]: Hosting environment: Production

2020-01-18T14:53:37.754802+00:00 app[api.1]: Content root path: /src

2020-01-18T14:53:37.754925+00:00 app[api.1]: Now listening on: http://[::]:59573

2020-01-18T14:53:37.754946+00:00 app[api.1]: Application started. Press Ctrl+C to shut down.

2020-01-18T14:53:39.762409+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/" host=dariorega-ecomm-api.herokuapp.com request_id=7538ce41-5d5e-4081-b214-eb1e50fdcc6c fwd="188.155.40.41" dyno= connect= service= status=503 bytes= protocol=https

2020-01-18T14:53:40.075446+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/favicon.ico" host=dariorega-ecomm-api.herokuapp.com request_id=4f1ff94a-eb45-4301-9c3a-74ece82abe84 fwd="188.155.40.41" dyno= connect= service= status=503 bytes= protocol=https

2020-01-18T14:53:51.155230+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/api" host=dariorega-ecomm-api.herokuapp.com request_id=1cc3eeac-1ce5-4a67-82e0-ee680beecc90 fwd="188.155.40.41" dyno= connect= service= status=503 bytes= protocol=https

2020-01-18T14:53:51.440188+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/favicon.ico" host=dariorega-ecomm-api.herokuapp.com request_id=caa51bcd-a153-444b-88b5-c024d1b2ae84 fwd="188.155.40.41" dyno= connect= service= status=503 bytes= protocol=https

2020-01-18T14:53:56.045125+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/weatherforecast" host=dariorega-ecomm-api.herokuapp.com request_id=bcdc8195-9da6-4258-a48b-4614d885302a fwd="188.155.40.41" dyno= connect= service= status=503 bytes= protocol=https

2020-01-18T14:53:56.292724+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/favicon.ico" host=dariorega-ecomm-api.herokuapp.com request_id=2329aa44-bdb0-43e3-bbbf-58bd87a09f8c fwd="188.155.40.41" dyno= connect= service= status=503 bytes= protocol=https

Журналы, которые я получаю в локальном контейнере: после запуска docker контейнера, запущенного с тем же dockerfile:

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://[::]:5000

info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.

info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production

info: Microsoft.Hosting.Lifetime[0]
      Content root path: /src

warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3]
      Failed to determine the https port for redirect

Но это работает

Заключение

Я много чего пробовал в файле docker или отредактировал файл program.cs, определяющий useUrl методы, но я все еще не могу заставить это работать. Я не знаю, связано ли что-то с процессом http / https, так как https не настроен / не работает. И героку пользуюсь https. Или я должен определить URL-адрес? Любая помощь приветствуется! Заранее спасибо за ваше время, потраченное на чтение этого

1 Ответ

0 голосов
/ 23 января 2020

Попробуйте настроить HttpsRedirection https://github.com/jincod/AspNetCoreDemoApp/blob/master/src/AspNetCoreDemoApp/Startup.cs#L13 и ForwardedHeadersOptions https://github.com/jincod/AspNetCoreDemoApp/blob/master/src/AspNetCoreDemoApp/Startup.cs#L23 -L29

PS: вы использовать развертывание контейнера без dotnetcore-buildpack :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...