Aspects pratiques du déploiement d'une application ASP.NET Core ancrée sur Heroku

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.


Image montrant le menu Heroku sans C #


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.


  1. Connectez-vous au registre de conteneurs Heroku.


     heroku container:login 

  2. Si vous n'avez pas de dépôt git existant, git init un nouveau


  3. 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 

  4. (Facultatif) Vérifiez que vous disposez de la télécommande Heroku en exécutant git remote -v


  5. Dites à Heroku d'utiliser des conteneurs:


     heroku stack:set container 

  6. Créez le fichier heroku.yml. La version minimaliste est quelque chose comme:


     build: docker: web: Dockerfile 

  7. 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); } 

  8. Tout engager:


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

  9. 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:
    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


  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/fr450904/


All Articles