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.

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.
Login ke registrasi kontainer Heroku.
heroku container:login
Jika Anda belum memiliki git repo, git init
yang baru
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
(Opsional) Periksa apakah Anda memiliki heroku remote dengan menjalankan git remote -v
Beri tahu Heroku untuk menggunakan wadah:
heroku stack:set container
Buat file heroku.yml. Versi minimalis adalah sesuatu seperti:
build: docker: web: Dockerfile
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); }
Komit semuanya:
git add . && git commit -m 'Meaningful commit message'
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:

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
- 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)