【问题标题】:.NetCore Docker Cloud Run: Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable.NetCore Docker Cloud Run:容器无法启动。无法启动并监听 PORT 环境变量定义的端口
【发布时间】:2021-10-07 11:41:51
【问题描述】:

我不知道这里有什么问题。 Google Cloud Run 给了我这个错误:

Ready 条件状态更改为 False for Revision ezposappapi-00003-miv 带有消息:云运行错误:容器失败 开始。无法启动并侦听由 端口环境变量。此修订的日志可能包含更多 信息...

我已经按照谷歌here的例子。

这是我的Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        #if DEBUG
        return Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
        #endif

        #if !DEBUG
        string port = Environment.GetEnvironmentVariable("PORT") ?? "8080";
        string url = String.Concat("http://0.0.0.0:", port);

        return Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>().UseUrls(url);
            });
        #endif
    }
}

容器在 Google Cloud Run 的 8080 端口上运行。 这是我的DockerFile

FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY ["EzPOSAppAPI/EzPOSAppAPI.csproj", "EzPOSAppAPI/"]
RUN dotnet restore "EzPOSAppAPI/EzPOSAppAPI.csproj"
COPY . .
WORKDIR "/src/EzPOSAppAPI"
RUN dotnet build "EzPOSAppAPI.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "EzPOSAppAPI.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "EzPOSAppAPI.dll"]

日志中还有另一个错误:

Uncaught signal: 6, pid=1, tid=1, fault_addr=0.
{
  "textPayload": "Uncaught signal: 6, pid=1, tid=1, fault_addr=0.",
  "insertId": "610768a70008741958ceffb7",
  "resource": {
    "type": "cloud_run_revision",
    "labels": {
      "service_name": "ezposappapi",
      "project_id": "digilife-software",
      "configuration_name": "ezposappapi",
      "revision_name": "ezposappapi-00003-miv",
      "location": "asia-southeast2"
    }
  },
  "timestamp": "2021-08-02T03:38:15.553951292Z",
  "severity": "ERROR",
  "labels": {
    "instanceId": "00bf4bf02dc90720030c58d69fb03c88335dbcae23dbf8624600d5b3cf9e014ff1bbb38d2b764f1cccc3ada43f158ca49843c576aca917efaa41d8bf51daf846"
  },
  "logName": "projects/digilife-software/logs/run.googleapis.com%2Fvarlog%2Fsystem",
  "receiveTimestamp": "2021-08-02T03:38:15.555133567Z"
}

没有更多的错误信息。我不知道如何解决这个问题。请帮忙。


编辑

这是我目前在本地机器上的尝试:

Program.cs:

public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            return 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/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY ["EzPOSAppAPI.csproj", "EzPOSAppAPI/"]
RUN dotnet restore "EzPOSAppAPI/EzPOSAppAPI.csproj"

WORKDIR "/src/EzPOSAppAPI"
COPY . .

RUN dotnet build "EzPOSAppAPI.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "EzPOSAppAPI.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "EzPOSAppAPI.dll"]

这是run 命令:

docker run -dt -v "C:\Users\astef\vsdbg\vs2017u5:/remote_debugger:rw" -v "C:\Users\astef\Documents\Projects\C Sharp\EzPOSAppAPI\EzPOSAppAPI\EzPOSAppAPI:/app" -v "C:\Users\astef\Documents\Projects\C Sharp\EzPOSAppAPI\EzPOSAppAPI:/src/" -v "C:\Users\astef\AppData\Roaming\Microsoft\UserSecrets:/root/.microsoft/usersecrets:ro" -v "C:\Users\astef\AppData\Roaming\ASP.NET\Https:/root/.aspnet/https:ro" -v "C:\Users\astef\.nuget\packages\:/root/.nuget/fallbackpackages3" -v "C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages:/root/.nuget/fallbackpackages" -v "C:\Program Files (x86)\Microsoft\Xamarin\NuGet\:/root/.nuget/fallbackpackages2" -e "DOTNET_USE_POLLING_FILE_WATCHER=1" -e "ASPNETCORE_LOGGING__CONSOLE__DISABLECOLORS=true" -e "ASPNETCORE_ENVIRONMENT=Development" -e "ASPNETCORE_URLS=https://+:443;http://+:80" -e "NUGET_PACKAGES=/root/.nuget/fallbackpackages3" -e "NUGET_FALLBACK_PACKAGES=/root/.nuget/fallbackpackages;/root/.nuget/fallbackpackages2;/root/.nuget/fallbackpackages3" -P --name EzPOSAppAPI --entrypoint tail ezposappapi:dev -f /dev/null

如何在Google Cloud Run 上进行设置?

【问题讨论】:

  • 尝试使用 UseUrls("http://*:8080"),我看到您在代码中公开了 80 并使用了 8080。两者都不是同一个端口,你知道吗?
  • 您好,我认为 Environment.GetEnvironmentVariable("PORT") 会自动分配 8080。无论如何,我确实喜欢您要求我更改为 UseUrls("http://*:8080") 的内容,但我遇到了同样的错误。我不确定更改是否实际上正在上传。我这样做docker tag ezposappapi asia.gcr.io/digilife-software/ezposappapi 更新构建和docker push asia.gcr.io/digilife-software/ezposappapi 推送新构建。我不确定这是否正确。我是 docker 新手。
  • 我祝你一件事,只需从 Github 获取任何工作代码并尝试,如果这工作将其与您的代码进行比较。这样您就可以轻松解决您的问题。
  • 1) 信号 6 表示您的程序称为 abort(),这意味着它崩溃或出现运行时错误。 2)您需要构建容器。然后,您需要重新部署到 Cloud Run。重新阅读您用来了解如何部署的教程。使用 gcloud builds submit,然后使用 gcloud run deploy。 3) 删除 #if 部分。发布干净的代码,以便我们知道使用了哪个部分。 4) 包含 Startup.cs 5) 从 Dockerfile 中删除 EXPOSE 语句。
  • 端口 443 通常用于 HTTPS。启用该端口不会有任何效果,因为 Cloud Run 支持您的应用的唯一方案是 HTTP。此外,Cloud Run 仅支持一个应用端口,默认为 8080,但可配置。

标签: docker asp.net-core google-cloud-run


【解决方案1】:

好的,这是我的问题。我收到信号 6,这意味着我的代码有问题。显然,当应用程序启动时,我试图访问数据库。数据库访问有问题(我不允许来自数据库实例的连接)。

我对@9​​87654321@ 和Program.cs 进行了一些更改。

这是我的工作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/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY ["EzPOSAppAPI.csproj", "EzPOSAppAPI/"]
RUN dotnet restore "EzPOSAppAPI/EzPOSAppAPI.csproj"

WORKDIR "/src/EzPOSAppAPI"
COPY . .

RUN dotnet build "EzPOSAppAPI.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "EzPOSAppAPI.csproj" -c Release -o /app/publish

FROM base AS final
ENV ASPNETCORE_URLS=http://*:${PORT}
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "EzPOSAppAPI.dll"]

我在ENTRYPOINT 之前添加了ENV ASPNETCORE_URLS=http://*:${PORT}

我也换了:

WORKDIR "/src/EzPOSAppAPI"
COPY . .

Visual Studio 2019 的 Docker 模板搞砸了,只能用于调试。

我也改了:

COPY ["EzPOSAppAPI/EzPOSAppAPI.csproj", "EzPOSAppAPI/"] 

COPY ["EzPOSAppAPI.csproj", "EzPOSAppAPI/"]

那么这是我的Program.cs:

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        #if DEBUG
        return Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
        #endif

        #if !DEBUG
        return Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>()
                    .ConfigureKestrel(options =>
                    {
                        var port = Convert.ToInt32(Environment.GetEnvironmentVariable("PORT") ?? "8080");
                        options.Listen(IPAddress.Any, port);
                    });
            });
        #endif
    }

我必须放#if DEBUG#if !DEBUG,因为在调试时,如果我将代码用于生产,它将无法工作。

我希望这对使用 Visual Studio 2019 中的默认 Docker 模板的人有所帮助。

【讨论】:

    猜你喜欢
    • 2021-11-10
    • 2021-11-10
    • 2019-09-03
    • 2021-05-24
    • 2021-05-13
    • 2021-07-26
    • 1970-01-01
    • 2022-01-12
    • 2022-12-01
    相关资源
    最近更新 更多