Praktis penggelaran aplikasi Inti ASP.NET berlabuh ke Heroku

Intro


.NET adalah pendatang baru di dunia open-source, dan popularitasnya jauh dari platform mainstream seperti Node.js. Jadi Anda bisa bayangkan ada beberapa tutorial yang berhubungan dengan .NET dan kerangka kerja seperti ASP.NET di Heroku. Dan mereka yang melakukannya, mungkin tidak akan menggunakan wadah.


Gambar menampilkan menu heroku tanpa C #


Apakah Anda melihat C # /. NET di sini? Ya saya juga.


Memulai


Tutorial ini akan menganggap Anda memiliki Docker, .NET Core dan alat Heroku diinstal. Saya akan menggunakan Linux (Ubuntu), tetapi AFAIK alat-alat tersebut adalah lintas-platform sehingga langkah-langkahnya akan sama untuk semua OS yang didukung.


Mari kita ambil contoh termudah - aplikasi MVC sederhana. Jika Anda tidak memilikinya, buat saja dengan menjalankan


dotnet new mvc --name mymvc 

Saya juga akan menganggap Anda memiliki buruh pelabuhan siap, mungkin sesuatu seperti yang diusulkan dalam tutorial ini :


 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"] 

Perhatikan bagaimana ENTRYPOINT diganti dengan CMD - lebih lanjut tentang itu nanti.
Jadi, cd ke folder aplikasi Anda dan mari kita mulai.


  1. Login ke registrasi kontainer Heroku.


     heroku container:login 

  2. Jika Anda belum memiliki git repo, git init yang baru


  3. Jalankan heroku create untuk membuat aplikasi baru, catat alamat git repo yang disediakan, mis


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

  4. (Opsional) Periksa apakah Anda memiliki heroku remote dengan menjalankan git remote -v


  5. Beri tahu Heroku untuk menggunakan wadah:


     heroku stack:set container 

  6. Buat file heroku.yml. Versi minimalis adalah sesuatu seperti:


     build: docker: web: Dockerfile 

  7. Secara default inti ASP.NET berjalan pada port 5000 dan 5001 (https). Heroku tidak akan membiarkan itu. Jika Anda mencoba menjalankannya apa adanya, Kestrel tidak akan memulai, melempar pengecualian:


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

    Heroku tampaknya memungkinkan Anda aplikasi untuk mendengarkan pada port yang ditentukan dalam variabel lingkungan $PORT . Jadi, Anda perlu memastikan aplikasi Anda mendengarkan itu, bukan yang default. Jika Anda menggunakan aplikasi default, ganti saja CreateWebHostBuilder dengan yang berikut di Program.cs :


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

  8. Komit semuanya:


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

  9. Sekarang dorong kode untuk membuat wadah dibangun dan dilepaskan (semoga saja):


     git push heroku master 

    Sekarang ingat ketika ENTRYPOINT diganti dengan CMD di dockerfile? Kami tidak memberikan argumen apa pun ke wadah, jadi ENTRYPOINT ["dotnet", "MyMvc.dll"] dan CMD ["dotnet", "MyMvc.dll"] harus berperilaku sama. Tetapi jika Anda meninggalkan ENTRYPOINT, Anda akan mendapatkan kesalahan:
    Kesalahan
    Sungguh kesalahan yang hebat - "Status respons pembaruan informasi yang tidak terduga"! Benar-benar memberi tahu Anda akar masalahnya.
    Masalah sebenarnya adalah bahwa ketika menggunakan heroku.yml minimalis yang saya tunjukkan di atas, Heroku akan mengharapkan instruksi CMD di dockerfile Anda. Ketika Anda menambahkannya, semuanya akan berfungsi dengan baik.



Kesimpulan


Sekarang Anda harus memiliki beberapa ide bagaimana menggunakan aplikasi Core ASP.NET sederhana untuk Heroku. Apakah ini intuitif? Sama sekali tidak. Apakah Heroku platform terbaik untuk meng-host aplikasi .NET Anda? Mungkin tidak. Tetapi karena mudah untuk mendaftar di sana dan paket paling dasar gratis - mungkin Anda mungkin ingin menyelenggarakan sesuatu di sana, hanya untuk bersenang-senang.


Referensi


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


All Articles