docker - ASP .NET Core 在 Heroku 上给出 System.Net.Sockets.SocketException 错误
问题描述
我正在尝试将 .NET 核心 Web API 部署到 Heroku。
下面是我的Dockerfile
:
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 AS runtime
WORKDIR /app
COPY /out ./
CMD ASPNETCORE_URLS=http://*:$PORT dotnet dotnetcoreapi.dll
这Dockerfile
在 Heroku 上运行良好,但是当我尝试使用
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 AS runtime
WORKDIR /app
COPY /out ./
ENTRYPOINT ["dotnet","dotnetcoreapi.dll"]
Heroku 给了我这个错误:
无法启动 Kestrel。System.Net.Sockets.SocketException (13):权限被拒绝
为什么ENTRYPOINT ["dotnet","dotnetcoreapi.dll"]
在 Heroku 上不起作用?两个版本在我的本地机器上都可以正常工作
解决方案
感谢 Chis 的回答和这篇博文,我刚刚解决了这个问题。
事实证明,Heroku 真的想为您处理端口(可能是出于安全原因)。
使用样板 asp 核心模板,添加 docker 支持,您可以从以下内容开始:
程序.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace TestWebApp
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
Dockerfile:
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
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 ["TestWebApp/TestWebApp.csproj", "TestWebApp/"]
RUN dotnet restore "TestWebApp/TestWebApp.csproj"
COPY . .
WORKDIR "/src/TestWebApp"
RUN dotnet build "TestWebApp.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "TestWebApp.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "TestWebApp.dll"]
Heroku 希望您的应用程序在 Heroku 在PORT
环境变量中为您提供的端口上运行。它将为您公开 80 (HTTP) 和 443 (HTTPS) 端口。所以你要做的是:
从您的 中删除这些行Dockerfile
:
EXPOSE 80
EXPOSE 443
然后你必须让你的应用程序监听那个端口。为了使它工作,你必须改变你的Program.cs
文件:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
var port = Environment.GetEnvironmentVariable("PORT");
webBuilder.UseStartup<Startup>()
.UseUrls("http://*:" + port);
});
然后 Heroku 就很神奇,您的应用程序仍然获得 HTTPS 支持。
暗示:
默认的 Dockerfile 不适用于 Heroku CLI。生成的 Dockerfile 应该从解决方案级别(而不是项目级别)运行。我无法强制 heroku CLI 使用 Dockerfile 形成嵌套目录。我让 id 工作的方式是:
- 转到您的解决方案目录
- 创建 Dockerfile
- 粘贴修改内容:
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["TestWebApp/TestWebApp.csproj", "TestWebApp/"]
RUN dotnet restore "TestWebApp/TestWebApp.csproj"
COPY ./TestWebApp ./TestWebApp
WORKDIR "/src/TestWebApp"
RUN dotnet build "TestWebApp.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "TestWebApp.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "TestWebApp.dll"]
heroku login
heroku container:login
heroku container:push web --app your-app & heroku container:release web --app your-app
推荐阅读
- javascript - 在 redux-observable 中链接异步操作
- vba - 在 Excel VBA 中按发件人和日期计算 Outlook 电子邮件
- sql - 使用 concat 函数 postgresql
- python - 如何在python中创建一个循环遍历字符串列表的函数
- node.js - 错误处理与庆祝不能正常工作
- json - json和请求的Dask内存泄漏问题
- python - 如何匹配字符串中的所有数字标记?
- python - pyarrow 在大型数据集上加速 toPandas() 无效
- node.js - node.js 中的 pm2 抛出错误 Cannot find module for require dotenv from command line
- gem5 - tick()函数在gem5中的作用是什么?