【问题标题】:I cannot resolve "Failed to start and then listen on the port defined by the PORT environment variable." error in Google Cloud Run with a Docker image我无法解决“无法启动并侦听 PORT 环境变量定义的端口”。使用 Docker 映像在 Google Cloud Run 中出错
【发布时间】:2022-01-12 20:01:18
【问题描述】:

我知道有manypostsaboutthis,但我仍然无法解决这个问题。这是一个使用 React 的 .Net Core 3.1 应用程序。

npm run build 成功完成。

我的 .env 文件中有 PORT=8080

我已将我的服务配置为在端口 8080 上运行。

我的 Dockerfile 设置为公开 8080:

但我仍然得到以下信息: Cloud Run error: Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable. Logs for this revision might contain more information.

我已经检查了日志,但它只显示了相同的消息,并带有指向自身的链接:

所以日志看起来毫无用处。

我的部署如下:

  1. docker build -f foobarDataViz.UI\Dockerfile --force-rm -t foobardataviz.ui . --no-cache 这会成功构建。
  2. docker run -d -p 8080:80 --name foobar foobardataviz.ui 这样运行成功,可以在8080端口本地浏览
  3. docker push us-central1-docker.pkg.dev/foobar-poc/foobar/foobardataviz.ui:latest
  4. 然后我去 Cloud Run 并点击“Edit and Deploy New Revision”,它做了一些处理,但失败并出现上述错误

因此,错误表明它没有暴露端口,或者它只是无法完全启动。会不会是我的 docker 镜像与我设置 Cloud Run 的方式不兼容?

提前致谢

【问题讨论】:

    标签: docker google-cloud-platform dockerfile google-cloud-run google-artifact-registry


    【解决方案1】:

    您的 #2:您的端口在容器中的 80 上提供服务,并在本地计算机上显示为 8080。你有你的问题。

    在配置 Cloud Run 服务时使用端口 80。此端口必须由 Cloud Run 监听,而不是您的容器未监听的 8080。但是,我不确定它是否会起作用。


    如果你在寻找 .NET 的配置解决方案,我绝对不知道 .NET 框架。


    编辑 1

    如果你执行那个命令

    docker run -d -p 8080:80 ...
    

    这意味着您将内部端口 80 转发到 Docker 外部并将其暴露在 8080 上。这就是您可以在 8080 端口上本地测试您的应用程序的原因。

    使用 Cloud Run,您可以进行类似的配置:您可以将端口设置为在容器内进行侦听。 (拿你的第一个截图,这是第 4 行)。您可以在部署 Cloud Run 服务时更改它

    尝试放80端口(我说试试是因为有时候80端口需要额外的权限)。

    现在,为什么您的 .NET 应用程序公开端口 80 而不是端口 8080,正如我所说,我绝对不知道!

    【讨论】:

    • 感谢@guillaume。您介意详细说明我的配置中设置端口 80 的位置吗?是不是这个:docker run -d -p 8080:80?如果是这样,我不明白docker run 命令将如何影响 GCR 容器
    • 非常感谢您的详细阐述。有效!!我仍然不明白为什么带有端口 80 的docker run 命令会影响到 GCR 的部署。对我来说,DockerFile 中的端口需要与 GCR 配置匹配似乎是合乎逻辑的。我在想docker run 只会影响本地实例。再次感谢!!!
    【解决方案2】:

    您的 dotnet 容器正在侦听的端口(默认)在 properties\launchsettings.json 中设置。默认配置如下:

    "applicationUrl": "https://localhost:5001;http://localhost:5000",
    

    注意:Cloud Run 实例(容器)不应侦听 HTTPS。 Cloud Run GFE 使用 HTTP 转发流量。

    修改properties\launchsettings.json如下,使用默认端口8080:

    "applicationUrl": "http://0.0.0.0:8080",
    

    更好的解决方案是修改 CreateHostBuilder() 以从环境中读取端口。

    namespace HelloWorld
    {
            public class Program
            {
                    public static void Main(string[] args)
                    {
                            CreateHostBuilder(args).Build().Run();
                    }
    
                    public static IHostBuilder CreateHostBuilder(string[] args)
                    {
                            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);
                            });
                    }
            }
    }
    

    【讨论】:

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