前言
.NET在开源世界中是一个相对较新的应用,它的流行远不及主流平台(如Node.js)。 因此,您可以想象很少有教程涉及.NET和Heroku上的ASP.NET等框架。 而那些容器可能不会使用容器。

您在这里看到C#/.NET吗? 是的,我也没有。
开始使用
本教程将假定您已安装Docker,.NET Core和Heroku工具。 我将使用Linux(Ubuntu),但是AFAIK这些工具是跨平台的,因此对于任何受支持的OS来说,步骤都是相同的。
让我们以最简单的情况为例-简单的MVC应用。 如果您没有,只需通过运行创建它
dotnet new mvc --name mymvc
我还要假设您已经准备好了dockerfile,也许像本教程中所建议的那样:
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"]
请注意ENTRYPOINT如何用CMD替换-稍后再介绍。
因此,将cd放入您应用的文件夹,开始吧。
登录到Heroku容器注册表。
heroku container:login
如果您没有现有的git repo,请git init
一个新的
运行heroku create
创建一个新应用,注意提供的git repo地址,例如
Creating salty-fortress-4191... done, stack is heroku-16 https://salty-fortress-4191.herokuapp.com/ | https://git.heroku.com/salty-fortress-4191.git
(可选)通过运行git remote -v
检查您是否拥有heroku remote。
告诉Heroku使用容器:
heroku stack:set container
创建heroku.yml文件。 简约版本类似于:
build: docker: web: Dockerfile
默认情况下,ASP.NET Core在端口5000和5001(https)上运行。 Heroku不允许这样做。 如果尝试按原样运行,则Kestrel无法启动,并引发异常:
System.Net.Sockets.SocketException (13): Permission denied
Heroku似乎允许您的应用监听$PORT
环境变量中指定的$PORT
。 因此,您需要确保您的应用监听此内容,而不是默认情况。 如果您使用的是默认应用,只需用Program.cs
的以下内容替换CreateWebHostBuilder
:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) { var port = Environment.GetEnvironmentVariable("PORT"); return WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .UseUrls("http://*:"+port); }
提交所有内容:
git add . && git commit -m 'Meaningful commit message'
现在推送代码以构建并释放容器(手指交叉):
git push heroku master
现在还记得dockerfile中用CMD替换ENTRYPOINT的时间吗? 我们没有将任何参数传递给容器,因此ENTRYPOINT ["dotnet", "MyMvc.dll"]
和CMD ["dotnet", "MyMvc.dll"]
行为应相似。 但是,如果您离开ENTRYPOINT,则会收到错误消息:

多么严重的错误-“意外更新更新响应状态”! 确实告诉您问题的根源。
真正的问题是,当使用上面显示的最低限度的heroku.yml
时,Heroku将在您的dockerfile中使用CMD指令。 当您添加它时,一切都应该正常工作。
结论
现在,您应该了解如何将简单的ASP.NET Core应用程序部署到Heroku。 直观吗? 绝对不会。 Heroku是托管.NET应用程序的最佳平台吗? 可能不是。 但是,由于在这里注册很容易,而且最基本的计划是免费的-也许您可能想在这里托管一些东西,只是为了好玩。
参考文献
- 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 )