Docker 和 Asp.net 核心的 Heroku 上的应用程序错误
Application Error on Heroku with Docker and Asp.net core
我正在使用 Docker 和 github 操作在 Heroku 上托管 asp.net 核心 api。
操作运行时,一切正常,应用程序已部署。在我转到 url 后,我收到一条 应用程序错误 消息。
这是我日志中的相关部分
2022-02-17T16:41:54.949789+00:00 app[web.1]: [16:41:54 DBG] Failed to bind to http://[::]:80 (IPv6Any). Attempting to bind to http://0.0.0.0:80 instead.
2022-02-17T16:41:54.966069+00:00 app[web.1]: Unhandled exception. System.Net.Sockets.SocketException (13): Permission denied
经过一些搜索,我发现this post, and also 说要在Program.cs文件中设置端口或在Docker文件中设置ASPNETCORE_URLS=http://*:$PORT
。我都试过了,但没有任何效果。
这是我的Docker文件
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["PeerNotation.Api.csproj", "."]
RUN dotnet restore "PeerNotation.Api.csproj"
COPY . .
WORKDIR "/src"
RUN dotnet build "PeerNotation.Api.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "PeerNotation.Api.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "PeerNotation.Api.dll"]
以及我的 Program.cs 文件中的代码片段
var port = Environment.GetEnvironmentVariable("PORT");
builder.WebHost.UseUrls($"http://*:{port}");
(我尝试记录端口,但它永远不会为空)
我遇到了同样的问题。如此处所述 asp net core 6.0 kestrel server is not working,.NET 6 不再使用 UseUrls()。
按照上述 link 的指南,我将此代码段添加到我的 Program.cs:
var portExists = int.TryParse(Environment.GetEnvironmentVariable("PORT"), out var port);
if (portExists)
{
builder.WebHost.ConfigureKestrel(options =>
{
options.ListenAnyIP(port);
});
}
部署后应用程序开始在 Heroku 中正常工作。
经过一些研究,我发现我使用错误的方式设置了端口。
我应该像这样将 url 添加到 WebApplication
对象:
if (app.Environment.IsProduction())
{
var port = Environment.GetEnvironmentVariable("PORT");
app.Urls.Add($"http://*:{port}");
}
现在,应用程序使用了正确的端口。
我正在使用 Docker 和 github 操作在 Heroku 上托管 asp.net 核心 api。
操作运行时,一切正常,应用程序已部署。在我转到 url 后,我收到一条 应用程序错误 消息。 这是我日志中的相关部分
2022-02-17T16:41:54.949789+00:00 app[web.1]: [16:41:54 DBG] Failed to bind to http://[::]:80 (IPv6Any). Attempting to bind to http://0.0.0.0:80 instead.
2022-02-17T16:41:54.966069+00:00 app[web.1]: Unhandled exception. System.Net.Sockets.SocketException (13): Permission denied
经过一些搜索,我发现this post, ASPNETCORE_URLS=http://*:$PORT
。我都试过了,但没有任何效果。
这是我的Docker文件
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["PeerNotation.Api.csproj", "."]
RUN dotnet restore "PeerNotation.Api.csproj"
COPY . .
WORKDIR "/src"
RUN dotnet build "PeerNotation.Api.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "PeerNotation.Api.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "PeerNotation.Api.dll"]
以及我的 Program.cs 文件中的代码片段
var port = Environment.GetEnvironmentVariable("PORT");
builder.WebHost.UseUrls($"http://*:{port}");
(我尝试记录端口,但它永远不会为空)
我遇到了同样的问题。如此处所述 asp net core 6.0 kestrel server is not working,.NET 6 不再使用 UseUrls()。
按照上述 link 的指南,我将此代码段添加到我的 Program.cs:
var portExists = int.TryParse(Environment.GetEnvironmentVariable("PORT"), out var port);
if (portExists)
{
builder.WebHost.ConfigureKestrel(options =>
{
options.ListenAnyIP(port);
});
}
部署后应用程序开始在 Heroku 中正常工作。
经过一些研究,我发现我使用错误的方式设置了端口。
我应该像这样将 url 添加到 WebApplication
对象:
if (app.Environment.IsProduction())
{
var port = Environment.GetEnvironmentVariable("PORT");
app.Urls.Add($"http://*:{port}");
}
现在,应用程序使用了正确的端口。