Dlaczego nie hostujesz .NET Core na Heroku?

Pomysł na tego posta przyszedł do mnie sam. Jak zwykle pomysłodawczynią była potrzeba. Szukałem jakiegoś przyjaznego i łatwego hostingu dla aplikacji napisanych w .NET Core.

Jednym z rozwiązań może być Heroku. Co prawda, nie obsługuje .NET Core natywnie, ale wspiera Dockera.

Z tego wpisu dowiesz się jak zrobić release aplikacji uruchomionej w kontenerze doker na Heroku.

Do dzieła!

Będziesz potrzebować
  1. .NET Core SDK – to wiadomo…
  2. Aplikacja ASP.NET Core albo jakieś Api napisane przy pomocy .NET Core
  3. Docker server na swojej maszynie
  4. Konto na Heroku
  5. Narzędzie heroku-cli
Po kolei
  1. .NET Core znajdziesz TUTAJ. Oczywiście potrzebne jest SDK.
  2. Do celów edukacyjnych użyję swój pet project. Repo znajdziesz TUTAJ.
  3. Docker. Instrukcja instalacji znajduje się TUTAJ.
  4. Konto na Heroku założysz TUTAJ. Odsyłam też do strony głównej.
  5. Last but not least – Heroku-CLI. Będzie nam potrzebne do zarządzania zasobami z poziomu konsoli. Instrukcja instalacji TUTAJ.

Podwijamy rękawy.

Zaczynamy od pliku Dockerfile

U mnie wygląda on tak:

# build
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app

COPY . .
RUN dotnet publish -c Release Crumbs.sln -o out

# image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build-env /app/out .

# standard entrypoint not used
# ENTRYPOINT [ "dotnet", "Crumbs.Api.dll" ]

# We will use this one with parametrized PORT
CMD ASPNETCORE_URLS=http://*:$PORT dotnet Crumbs.Api.dll

Jak widzisz ENTRYPOINT jest zakomentowany, zatem komenda dotnet uruchamiająca aplikację Crumbs.Api.dll nie wywoła się w ten sposób. W przypadku Heroku nie powinna.

Dlaczego?

Ponieważ to Heroku ustala porty jakie zostaną wystawione na zewnątrz kontenera. Dlatego należy tę wartość parametryzować, tak jak widzicie powyżej w pliku Dockerfile.

W przeciwnym razie czekają nas problemy np. z uruchomieniem Kestrel’a…

Budowa obrazu docker

Obraz budujemy standardowo i uruchamiamy standardowo. Ten krok test potrzebny aby sprawdzić nasz Dockerfile i naszą aplikację. Jeśli jesteś pewien/pewna swojego kodziku, może zostać pominięty.

docker build -t YourAppName .

docker run -d -p 8080:80 --name abc YourAppName

Dodanie aplikacji na Heroku

Kiedy nasz kontener sobie grzecznie czeka zajmiemy się konfiguracją.

Potrzebna jest Ci nowa aplikacja na Heroku, więc podajemy nazwę aplikacji, region i voila!

Na następnym ekranie można zobaczyć metody deploymentu do wyboru. Nas interesuje Container registry.

Na przyszłość – te ustawienia znajdziesz w zakładce „Deploy”.

Dalej postępujemy wedle zaleceń Heroku.

Naprawdę, żadna filozofia.

Trzeba się zalogować w heroku-cli. Wystarczy wpisać w konsoli …

heroku login

Zostaniesz przeniesiony do przeglądarki gdzie będziesz mógł/mogła przejść proces logowania.

Teraz musisz się zalogować w rejestrze kontenerów. Również w konsoli…

heroku container:login

To bardzo istotny krok, ponieważ bez zalogowania się nie będziesz mógł/mogła wypchnąć swojego obrazu do rejestru.

Obraz buduje się i wypycha tak jak poniżej. Komendę tę należy wykonać w tym samym katalogu gdzie znajduje się nasz Dockerfile ponieważ Heroku buduje ten obraz na nowo i doopiero po prawidłowym zbudowaniu wypycha go do rejestru.

heroku container:push -a NazwaAplikazji_UstawionaWHeroku web

Ok! Done.

Wypchnięcie obrazu do rejestru to jedno, ale release aplikacji to inna sprawa. Tutaj również z pomocą przychodzi heroku-cli.

heroku container:release -a NazwaAplikazji_UstawionaWHeroku web

Jeśli chcesz zobaczyć logi Twojej aplikacji na heroku, używasz komendy

heroku logs --tail -a NazwaAplikazji_UstawionaWHeroku

I to wszystko!

Dosłownie kilka kroków i kilka komend i można już deploynąć swoją mini aplikację w świat.

Jak widać moja metoda kontrolera niewiele robi, poza zwróceniem stringa „Testing crumb controller”. W tej chwili, więcej nam nie trzeba.

Jeśli zajdzie potrzeba aktualizacji tej aplikacji wystarczy, że jeszcze raz zbudujesz i wypchniesz obraz do rejestru, a potem jeszcze raz zrobisz release.

heroku container:push -a NazwaAplikazji_UstawionaWHeroku web

heroku container:release -a NazwaAplikazji_UstawionaWHeroku web

Voilea!

Właśnie zdeployowałeś/zdeployowałaś (corpo-mowa 😀 ) swój pierwszy kontener dockerowy na Heroku.

Czyż to nie fajne?

Teraz pozostaje już tylko tworzyć i tworzyć.

Powodzenia!

Photo by Teng Yuhong on Unsplash

Newsletter



Społecznościowe

Historycznie

Tagi