Проблемы с развертыванием фреймворка ботов Microsoft на heroku с докером - PullRequest
0 голосов
/ 30 октября 2019

Я новичок в Docker и C # и пытаюсь развернуть каркас ботов Microsoft в Heroku с Docker

Я использую этот предварительно созданный пример:

https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/13.core-bot iобновил настройки приложения, указав правильные учетные данные Luis. Я создал службу Azure Bot с этой конечной точкой: https://mybotfram.herokuapp.com/api/messages

Then i updated the bot service credential in the app setting json. 

{
  "MicrosoftAppId": "****************************************",
  "MicrosoftAppPassword": "********************",
  "LuisAppId": "********************",
  "LuisAPIKey": "********************",
  "LuisAPIHostName": "westus.api.cognitive.microsoft.com"
}

Моя папка выглядит следующим образом:

enter image description here

Затем в нужную папку:

heroku container:login
heroku create myrepeat
heroku container:push web --app mybotfram
heroku container:release web --app mybotfram

Мой Dockerfile выглядит следующим образом:


FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /app

# copy csproj and restore as distinct layers
COPY ./*.csproj .
RUN dotnet restore

# copy everything else and build app
COPY ./. .
WORKDIR /app
RUN dotnet publish -c Release -o out


FROM microsoft/dotnet:2.1-aspnetcore-runtime AS runtime
WORKDIR /app
# COPY ./*.bot ./
COPY --from=build /app/out ./
ENTRYPOINT ["dotnet", "CoreBot.dll"]

Конечная точка не работает, и я получаю эту ошибку в журналах Heroku, похоже, ничегоработает должным образом.

2019-10-30T15:23:32.220067+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=POST path="/api/messages" host=mybotfram.herokuapp.com request_id=edda2c79-ab2e-4258-8a17-38a145f06f06 fwd="13.94.246.37" dyno= connect= service= status=503 bytes= protocol=https
2019-10-30T15:25:52.90006+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=POST path="/api/messages" host=mybotfram.herokuapp.com request_id=387e5fcf-7330-45f9-8751-d3c156618565 fwd="13.94.246.37" dyno= connect= service= status=503 bytes= protocol=https
2019-10-30T15:33:14.734976+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=mybotfram.herokuapp.com request_id=5b7a5fe7-9371-4911-a563-d3aeba8411c4 fwd="84.101.210.119" dyno= connect= service= status=503 bytes= protocol=https
2019-10-30T15:33:14.383936+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/api/messages" host=mybotfram.herokuapp.com request_id=75836fb3-afca-4725-9b00-1ffcdec0e2a1 fwd="84.101.210.119" dyno= connect= service= status=503 bytes= protocol=https

Как уже упоминалось, я новичок в этом, поэтому любые идеи по вышеизложенному будет принята с благодарностью!


_________________________________________ РЕДАКТИРОВАТЬ __________________________________


Редактирование после ответа Mdrichardson (большое спасибо!).

Вот способ, которым я переписал мой Program.cs на основе вашего ввода.

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Logging;
using System;

namespace Microsoft.BotBuilderSamples
{
    public class Program
    {
        public static void Main(string[] args)
                {
                    CreateWebHostBuilder(args)
                        .UseKestrel()
                        .UseUrls("http://0.0.0.0:" + Environment.GetEnvironmentVariable("PORT"))
                        .Build()
                        .Run();
                }


        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .ConfigureLogging((logging) =>
                {
                    logging.AddDebug();
                    logging.AddConsole();
                })
                .UseStartup<Startup>();
    }
}

1 Ответ

1 голос
/ 31 октября 2019

Ниже в этом разделе приведены подробные инструкции

Для вас, в частности:

503 ошибки обычно указывают, что ваш клиент не может связаться с ботом.

Я предполагаю, что вам нужно обновить Program.cs, чтобы он содержал следующее:

public static void Main(string[] args)
{
    CreateWebHostBuilder(args)
        .UseKestrel()
        .UseUrls("http://0.0.0.0:" + Environment.GetEnvironmentVariable("PORT"))
        .Build()
        .Run();
}

Heroku предоставляет открытый порт через переменную окружения PORT. Ваш бот просто должен слушать его.

Если это не сработает для вас, я рекомендую начать с нуля и следовать учебному пособию ниже


Получилэто работает с нуля.

Как докернизировать вашего бота и развернуть его на Heroku

Большая часть заслуг для этого должна достаться Виктору Рейесу для этой статьи , посколькуЯ в основном сделал то же самое, но с ботом.

В следующем уроке будут рассмотрены основы и предполагается, что вы немного знаете о разработке ботов. См. Статью для получения дополнительной информации о стороне докера / Heroku и наших официальных документах о бот-стороне.

1. Загрузка CoreBot .

2. Обновите appsettings.json информацией о вашем боте и LUIS.

3. Запустите приложение локально и убедитесь, что оно работаетв Эмулятор . Это проверяет, что ваш бот работает вообще.

4. Создайте файл docker в корневой папке с вашим .csproj. Он должен выглядеть следующим образом:

FROM mcr.microsoft.com/dotnet/core/sdk:2.2.300-alpine3.9 as server

ENV ASPNETCORE_Environment=Production
ENV ASPNETCORE_URLS http://+:3978

WORKDIR /server
VOLUME ./wwwroot/Repository
COPY . ./

RUN dotnet publish -c Release -o publish

EXPOSE 3978/tcp

ENTRYPOINT ["dotnet","publish/CoreBot.dll"]

5. Из корневой папки с файлом .csproj запустите docker build -t <dockerImageName>:<tag> .

6. Выполнить docker run -p 3978:3978 <dockerImageName>:<tag>

7. Запустить приложение локально и убедиться, что оно работает в Эмулятор . Это проверяет, что ваш бот работает как образ Docker.

8. Обновите ваш файл Docker так, чтобы он теперь выглядел так:

FROM mcr.microsoft.com/dotnet/core/sdk:2.2.300-alpine3.9 as server

ENV ASPNETCORE_Environment=Production

WORKDIR /server
COPY . ./

RUN dotnet publish -c Release -o publish

ENTRYPOINT ["dotnet","publish/CoreBot.dll"]

9. Перезаписать Main() в Program.cs, чтобы оно содержало:

public static void Main(string[] args)
{
    CreateWebHostBuilder(args)
        .UseKestrel()
        .UseUrls("http://0.0.0.0:" + Environment.GetEnvironmentVariable("PORT"))
        .Build()
        .Run();
}

10. Выполните следующее:

heroku login
heroku container:login
docker login --username=_ --password=$(heroku auth:token) registry.heroku.com

11. Создайте приложение Heroku и запомните его

12. Выполнить:

docker build -t registry.heroku.com/<appName>/web .
docker push registry.heroku.com/<appName>/web
heroku container:release web --app <appName>

13. Проверьте в эмуляторе, используя https://<appName>.herokuapp.com/api/messages и ваши MicrosoftAppId и MicrosoftAppPassword

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