将dockerized ASP.NET Core应用程序部署到Heroku的实用性

前言


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


该图显示了没有C#的heroku菜单


您在这里看到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放入您应用的文件夹,开始吧。


  1. 登录到Heroku容器注册表。


     heroku container:login 

  2. 如果您没有现有的git repo,请git init一个新的


  3. 运行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 

  4. (可选)通过运行git remote -v检查您是否拥有heroku remote。


  5. 告诉Heroku使用容器:


     heroku stack:set container 

  6. 创建heroku.yml文件。 简约版本类似于:


     build: docker: web: Dockerfile 

  7. 默认情况下,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); } 

  8. 提交所有内容:


     git add . && git commit -m 'Meaningful commit message' 

  9. 现在推送代码以构建并释放容器(手指交叉):


     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应用程序的最佳平台吗? 可能不是。 但是,由于在这里注册很容易,而且最基本的计划是免费的-也许您可能想在这里托管一些东西,只是为了好玩。


参考文献


  1. https://devcenter.heroku.com/articles/container-registry-and-runtime
  2. https://devcenter.heroku.com/articles/build-docker-images-heroku-yml
  3. https://docs.docker.com/engine/examples/dotnetcore/(Dockerfile

Source: https://habr.com/ru/post/zh-CN450904/


All Articles