Praktische Informationen zum Bereitstellen einer dockerisierten ASP.NET Core-Anwendung auf Heroku

Intro


.NET ist ein relativer Neuling in der Open-Source-Welt, und seine Popularität ist bei weitem nicht annähernd Mainstream-Plattformen wie Node.js. Sie können sich also vorstellen, dass es nur wenige Tutorials gibt, die sich mit .NET und Frameworks wie ASP.NET auf Heroku befassen. Und diejenigen, die dies tun, werden wahrscheinlich keine Container verwenden.


Bild zeigt Heroku-Menü ohne C #


Sehen Sie hier C # /. NET? Ja, ich auch nicht.


Erste Schritte


In diesem Tutorial wird davon ausgegangen, dass Sie die Tools Docker, .NET Core und Heroku installiert haben. Ich werde Linux (Ubuntu) verwenden, aber AFAIK diese Tools sind plattformübergreifend, so dass die Schritte für jedes unterstützte Betriebssystem gleich sind.


Nehmen wir den einfachsten Fall - die einfache MVC-App. Wenn Sie noch keine haben, erstellen Sie sie einfach durch Ausführen


dotnet new mvc --name mymvc 

Ich gehe auch davon aus, dass Sie eine Docker-Datei bereit haben, vielleicht so etwas wie in diesem Tutorial vorgeschlagen:


 FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS builder WORKDIR /sources COPY *.csproj . RUN dotnet restore COPY . . RUN dotnet publish --output /app/ --configuration Release FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 WORKDIR /app COPY --from=builder /app . CMD ["dotnet", "MyMvc.dll"] 

Beachten Sie, wie ENTRYPOINT durch CMD ersetzt wurde - dazu später mehr.
Also, CD in den Ordner Ihrer App und los geht's.


  1. Melden Sie sich bei der Heroku-Containerregistrierung an.


     heroku container:login 

  2. Wenn Sie kein vorhandenes Git-Repo haben, git init ein neues Git-Repo


  3. Führen Sie heroku create , um eine neue App zu erstellen. heroku create Sie sich die angegebene Git-Repo-Adresse, z


     Creating salty-fortress-4191... done, stack is heroku-16 https://salty-fortress-4191.herokuapp.com/ | https://git.heroku.com/salty-fortress-4191.git 

  4. (Optional) Überprüfen Sie, ob Sie Heroku Remote haben, indem Sie git remote -v ausführen


  5. Sagen Sie Heroku, dass er Behälter verwenden soll:


     heroku stack:set container 

  6. Erstellen Sie die Datei heroku.yml. Minimalistische Version ist so etwas wie:


     build: docker: web: Dockerfile 

  7. Standardmäßig wird der ASP.NET-Kern auf Port 5000 und 5001 (https) ausgeführt. Heroku wird das nicht zulassen. Wenn Sie versuchen, es so wie es ist auszuführen, startet Kestrel nicht und löst eine Ausnahme aus:


     System.Net.Sockets.SocketException (13): Permission denied 

    Heroku scheint es Ihrer App zu ermöglichen, den in der Umgebungsvariablen $PORT angegebenen Port abzuhören. Sie müssen also sicherstellen, dass Ihre App dies hört und nicht die Standardeinstellung. CreateWebHostBuilder Sie die Standard-App verwenden, ersetzen Sie CreateWebHostBuilder durch die folgende in Program.cs :


      public static IWebHostBuilder CreateWebHostBuilder(string[] args) { var port = Environment.GetEnvironmentVariable("PORT"); return WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .UseUrls("http://*:"+port); } 

  8. Alles festschreiben:


     git add . && git commit -m 'Meaningful commit message' 

  9. Drücken Sie nun den Code, um den Container zu erstellen und freizugeben (Daumen drücken):


     git push heroku master 

    Erinnern Sie sich jetzt, als ENTRYPOINT in Dockerfile durch CMD ersetzt wurde? Wir übergeben keine Argumente an den Container, daher sollten sich ENTRYPOINT ["dotnet", "MyMvc.dll"] und CMD ["dotnet", "MyMvc.dll"] ähnlich verhalten. Wenn Sie ENTRYPOINT verlassen, wird eine Fehlermeldung angezeigt:
    Fehler
    Was für ein großer Fehler - "Unerwarteter Status der Aktualisierung der Antwort"! Sagt Ihnen wirklich die Wurzel des Problems.
    Das eigentliche Problem ist, dass Heroku bei Verwendung der oben heroku.yml minimalistischen heroku.yml CMD-Anweisung in Ihrer Docker-Datei erwartet. Wenn Sie es hinzufügen, sollte alles gut funktionieren.



Fazit


Jetzt sollten Sie eine Vorstellung davon haben, wie Sie einfache ASP.NET Core-Apps für Heroku bereitstellen. Ist es intuitiv? Absolut nicht. Ist Heroku die beste Plattform zum Hosten Ihrer .NET-Apps? Wahrscheinlich nicht. Aber da es einfach ist, sich dort anzumelden und der einfachste Plan kostenlos ist, möchten Sie vielleicht etwas veranstalten, nur zum Spaß.


Referenzen


  1. https://devcenter.heroku.com/articles/container-registry-and-runtime
  2. https://devcenter.heroku.com/articles/build-docker-images-heroku-yml
  3. https://docs.docker.com/engine/examples/dotnetcore/ (Dockerfile)

Source: https://habr.com/ru/post/de450904/


All Articles