0

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

npm run build成功完成。

PORT=8080的 .env 文件中有

我已将我的服务配置为在端口 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 并单击“编辑和部署新修订版”,它会进行一些处理,但由于上述错误而失败

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

提前致谢

4

2 回答 2

2

您的#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,正如我所说,我绝对不知道!

于 2021-12-07T20:30:33.897 回答
0

您的 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-12-08T19:01:06.133 回答