将 .NET Core 部署到 Heroku
我一直很喜欢用 C# 编程。同样,我也很喜欢用 Heroku 来托管个人项目——他们的用户界面很棒,而且还有免费套餐!
但是,也存在一些限制。值得注意的是,.NET Core 目前不支持😢。不过我们可以解决这个问题!
修复方案
虽然 Heroku 无法直接运行 C# 代码,但它支持 Docker 容器。因此,我们的解决方案很明确——将一切容器化!
将 .NET Core 应用部署到 Docker
以下内容并非 .NET Core 课程,但如果您是初学者,或许可以从中学习到一些关于浏览基础文件的基础知识。我们将涵盖以下内容:
- 从命令行创建一个新的 .NET Core MVC 项目
- 修改基础文件以使其与 Heroku 和 Docker 兼容。
- 配置新的 Heroku 应用
- 将我们的应用部署到 Heroku 🚀
1. 入门指南
在开始修改代码之前,我们需要先理顺基础组件。继续之前,您应该具备以下条件:
- 您的设备上已安装 .NET Core
- 本教程使用的是 v3.1 版本,您可以在这里找到它。
- 设备上已安装 Docker
- 您可以按照以下步骤操作。
- 注册一个 Heroku 账号! - https://signup.heroku.com/
- 安装Heroku CLI,它允许我们与容器注册表进行通信。
这些都解决了,我们准备出发。
2. 创建新的 .NET Core 应用程序
首先,我们需要创建一个新的.NET Core应用程序。我将按照这里提供的步骤来设置一个基本的.NET Core MVC项目。
3. 设置新的 Dockerfile
所需的 Dockerfile 非常基础,没有太多复杂之处。
# Dockerfile
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# Copy everything else and build
COPY . .
RUN dotnet publish -c Release -o out
# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build-env /app/out .
# Run the app on container startup
# Use your project name for the second parameter
# e.g. MyProject.dll
ENTRYPOINT [ "dotnet", "HerokuApp.dll" ]
此外,您可能还需要设置一个 .dockerignore 文件来减小镜像大小。
# .dockerignore
bin/
obj/
如果您想测试您的容器,可以运行
docker build -t YourAppName .
# The name variable (abc) is simply used to refer to the
# container later when we want to close everything down.
docker run -d -p 8080:80 --name abc YourAppName
访问http://localhost:8080,您应该可以看到您的应用程序正在运行。
一切正常吗?太好了!我们先在本地关闭容器。如果它马上要上线运行,我们就不需要它在这里运行了!
docker rm --force abc
4. 在 Heroku 中配置新应用
- 登录 Heroku,然后通过您的个人控制面板(https://dashboard.heroku.com/apps )创建一个新应用。
- 您需要提供应用程序名称和部署区域
- Heroku 随后会显示各种部署选项。我们将使用容器注册表。

5. 发布到 Heroku 🚀
最后,让我们把它放到网上。
1. 使用命令行登录 Heroku 容器注册表。
heroku container:login
2. 如果你没有按照上述步骤操作,请确保构建你的 Docker
容器!
docker build -t YourAppName .
3. 将新建的容器推送到 Heroku
# 'YourAppName' should be the name of the app you
# configured in Heroku in step 4.
heroku container:push -a YourAppName web
4. 最后,发布!
heroku container:release -a YourAppName web
现在,如果您访问https://your-app-name.herokuapp.com,应该就能看到基础应用了。等等……好像不行!怎么回事?!
请查看 Heroku 日志。
heroku logs --tail
在这些看起来很吓人的日志中,你会看到 .NET Core 启动“Kestrel”(.NET Core 的 Web 服务器)失败了。这意味着我们的应用无法启动😢。 如果你还记得,之前我们在本地配置 Docker 容器时,传递的参数之一就是端口。当 Heroku 给我们分配端口时,我们的应用需要知道这个端口!
修改 Dockerfile 的结尾,使其变为
# Dockerfile
# ...
# ENTRYPOINT [ "dotnet", "HerokuApp.dll" ]
# Use the following instead for Heroku
CMD ASPNETCORE_URLS=http://*:$PORT dotnet HerokuApp.dll
这样一来,我们的容器就可以在启动时使用 Heroku 提供的端口。
将所有内容重新部署到 Heroku:
- 构建 Docker 镜像
- 执行 heroku container:push
- 执行 heroku container:release 命令
瞧!您自己的 .NET Core 应用就托管在网络上了。
结论
我希望以上教程对大家有所帮助,并能让一些新手开始进行自己的 .NET Core 项目。
如果读者有任何补充建议或更好的方法,请在下方留言!
感谢阅读👋
文章来源:https://dev.to/alrobilliard/deploying-net-core-to-heroku-1lfe