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.

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.
Melden Sie sich bei der Heroku-Containerregistrierung an.
heroku container:login
Wenn Sie kein vorhandenes Git-Repo haben, git init
ein neues Git-Repo
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
(Optional) Überprüfen Sie, ob Sie Heroku Remote haben, indem Sie git remote -v
ausführen
Sagen Sie Heroku, dass er Behälter verwenden soll:
heroku stack:set container
Erstellen Sie die Datei heroku.yml. Minimalistische Version ist so etwas wie:
build: docker: web: Dockerfile
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); }
Alles festschreiben:
git add . && git commit -m 'Meaningful commit message'
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:

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
- https://devcenter.heroku.com/articles/container-registry-and-runtime
- https://devcenter.heroku.com/articles/build-docker-images-heroku-yml
- https://docs.docker.com/engine/examples/dotnetcore/ (Dockerfile)