Intro
.NET est un nouveau venu relatif dans le monde open-source, et sa popularité est loin des plateformes grand public comme Node.js. Vous pouvez donc imaginer qu'il existe peu de didacticiels qui traitent de .NET et de cadres tels que ASP.NET sur Heroku. Et ceux qui le font n'utiliseront probablement pas de conteneurs.

Voyez-vous C # /. NET ici? Oui, moi non plus.
Pour commencer
Ce didacticiel suppose que les outils Docker, .NET Core et Heroku sont installés. J'utiliserai Linux (Ubuntu), mais AFAIK, ces outils sont multiplates-formes, donc les étapes seront les mêmes pour tout système d'exploitation pris en charge.
Prenons le cas le plus simple - une application MVC simple. Si vous n'en avez pas, créez-le simplement en exécutant
dotnet new mvc --name mymvc
Je suppose également que vous avez un dockerfile prêt, peut-être quelque chose comme proposé dans ce tutoriel :
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"]
Notez comment ENTRYPOINT a été remplacé par CMD - plus à ce sujet plus tard.
Alors, cd dans le dossier de votre application et commençons.
Connectez-vous au registre de conteneurs Heroku.
heroku container:login
Si vous n'avez pas de dépôt git existant, git init
un nouveau
Exécutez heroku create
pour créer une nouvelle application, notez l'adresse git repo fournie, par exemple
Creating salty-fortress-4191... done, stack is heroku-16 https://salty-fortress-4191.herokuapp.com/ | https://git.heroku.com/salty-fortress-4191.git
(Facultatif) Vérifiez que vous disposez de la télécommande Heroku en exécutant git remote -v
Dites à Heroku d'utiliser des conteneurs:
heroku stack:set container
Créez le fichier heroku.yml. La version minimaliste est quelque chose comme:
build: docker: web: Dockerfile
Par défaut, le noyau ASP.NET s'exécute sur les ports 5000 et 5001 (https). Heroku ne le permettra pas. Si vous essayez de l'exécuter tel quel, Kestrel ne démarre pas, lançant une exception:
System.Net.Sockets.SocketException (13): Permission denied
Heroku semble permettre à votre application d'écouter sur le port spécifié dans la variable d'environnement $PORT
. Vous devez donc vous assurer que votre application l'écoute plutôt que par défaut. Si vous utilisez l'application par défaut, remplacez simplement CreateWebHostBuilder
par la suivante dans Program.cs
:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) { var port = Environment.GetEnvironmentVariable("PORT"); return WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .UseUrls("http://*:"+port); }
Tout engager:
git add . && git commit -m 'Meaningful commit message'
Maintenant, poussez le code pour obtenir et libérer le conteneur (doigts croisés):
git push heroku master
Rappelez-vous maintenant quand ENTRYPOINT a été remplacé par CMD dans dockerfile? Nous ne transmettons aucun argument au conteneur, donc ENTRYPOINT ["dotnet", "MyMvc.dll"]
et CMD ["dotnet", "MyMvc.dll"]
devraient se comporter de la même manière. Mais si vous quittez ENTRYPOINT, vous obtiendrez une erreur:

Quelle grande erreur - "Statut de réponse de mise à jour de fomation inattendu"! Vous indique vraiment la racine du problème.
Le vrai problème est que lorsque vous utilisez heroku.yml
minimaliste que j'ai montré ci-dessus, Heroku attendra des instructions CMD dans votre dockerfile. Lorsque vous l'ajoutez, tout devrait fonctionner correctement.
Conclusion
Vous devriez maintenant avoir une idée de la façon de déployer des applications ASP.NET Core simples sur Heroku. Est-ce intuitif? Absolument pas. Heroku est-il la meilleure plate-forme pour héberger vos applications .NET? Probablement pas. Mais comme il est facile de s'y inscrire et que le plan le plus basique est gratuit - vous voudrez peut-être y héberger quelque chose, juste pour le plaisir.
Les références
- 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)