本篇將會教你如何透過 Docker 部屬 .NET Core 應用程式到 Heroku 上,內容並不包含 Heroku 的註冊與使用、Docker 使用方式。

首先建立一個 ASP.NET Core Web Application 專案,在選擇範本時請開啟 Docker,並且將 Docker Image 環境設定為 Linux,即便你是使用 Windows 來開發應用程式,這邊以 API 範本專案為例。

將 Docker Image 環境設定為 Linux,即便你是使用 Windows 來開發應用程式

並將範本建立的 DockerFile 修改一下,此示範專案名稱為 HerokuDockerDeployment,請改成你建立的專案名稱。這邊 Markdown 似乎有跑板問題,建議複製到其他地方察看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["HerokuDockerDeployment.csproj", "HerokuDockerDeployment/"]
RUN dotnet restore "HerokuDockerDeployment/HerokuDockerDeployment.csproj"
WORKDIR "/src/HerokuDockerDeployment"
COPY . .
RUN dotnet build "HerokuDockerDeployment.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "HerokuDockerDeployment.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
CMD ASPNETCORE_URLS=http://*:$PORT dotnet HerokuDockerDeployment.dll

開啟 PowerShell 並將目錄切換至專案所在的位置(~/source/repos/<solution-name>/<project-name>)。

在將 .NET Core app 新增到 Docker Image 前,必須先將它發佈一次。

dotnet publish -c Release

建立 Docker Image。

docker build -t <docker-image-name> .

透過 tag 指令來將 Docker Image 附加到 Heroku 的 Target Image。

docker tag <docker-image-name> registry.heroku.com/<heroku-app-name>/web

接下來需使用 Heroku CLI 來進行 Heroku 的佈署,若沒有安裝請點選連結到官網下載安裝。

登入 Heroku 且登入 Container 註冊表。

heroku login
heroku container:login

建立 Docker Image 並推到 Container 註冊表上。

heroku container:push web -a <heroku-app-name>

上述流程都成功後即可發佈。

heroku container:release web -a <heroku-app-name>

這樣就完成在 Heroku 上部屬 .NET Core 應用程式,開啟 APP 來確認是否有正確運作。

後續換版只需要重複以下行為即可,別忘了將目錄切換至專案所在的位置(~/source/repos/<solution-name>/<project-name>)。

heroku container:login
heroku container:push web -a <heroku-app-name>
heroku container:release web -a <heroku-app-name>

參考資料
Deploy ASP.NET Core 3.1 Web API to Heroku with Docker – Jakub Wajs
使用 Docker 教學課程將應用程式容器化 - .NET Core | Microsoft Docs