容器启动失败。无法启动,然后监听 PORT 环境变量定义的端口

Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable

我构建了容器映像,但当我尝试从 gcloud 命令行或 Cloud Console 部署它时,出现以下错误:"Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable."

在您的代码中,您可能没有侦听传入的 HTTP 请求,或者您在错误的端口上侦听传入的请求。

Cloud Run container runtime contract 中所述,您的容器必须在云 运行 定义并在 $PORT 环境变量中提供的端口上侦听传入的 HTTP 请求。

如果您的容器未能在预期的端口上侦听,修订健康检查将失败,修订将处于错误状态并且流量将不会路由到它。

例如,在 Node.js 中使用 Express,您应该使用 :

const port = process.env.PORT || 8080;
app.listen(port, () => {
  console.log('Hello world listening on port', port);
});

围棋:

port := os.Getenv("PORT")
if port == "" {
        port = "8080"
   }
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))

在python中:

app.run(port=int(os.environ.get("PORT", 8080)),host='0.0.0.0',debug=True)

另一个原因可能是我观察到的那个。 Docker 图片可能没有 运行 应用程序所需的代码。

我有一个用 TypeScript 编写的 Node 应用程序。为了将应用程序 dockerize 化,我需要做的就是编译代码 tsc 和 运行 docker build 但我认为 gcloud builds submit 会处理它并选择编译后的代码作为Docker 文件与 .dockerignore 一起建议,将构建我的源代码并提交到存储库。

但它所做的只是复制我的源代码并提交到 Cloud Build,并且根据 Docker 文件,与对编译代码进行 docker 化相比,它对我的​​源代码进行了 docker 化。

因此,如果您使用需要编译的语言编写源代码,请记住在 Docker 文件中包含构建步骤。

  • 请记住,每次将图像推送到存储库时,启用 Docker 文件中的构建步骤都会增加图像大小。它正在吃那边的 space,google 会向你收费。

另一种可能性是docker图像以需要时间才能完成的命令结束。到部署开始时,服务器尚未 运行ning 并且运行状况检查将变为空白。

那是什么命令?通常 运行 将服务器置于开发模式的任何命令。对于 Scala/SBT 它将是 sbt run 或者在 Node 中它将是 npm run dev 之类的东西。简而言之,请确保 运行 仅在打包的版本上。

Cloud 运行 正在生成默认的 yaml 文件,其中包含硬编码的默认端口:

spec:
  containerConcurrency: 80
  timeoutSeconds: 300
  containers:
  - image: us.gcr.io/project-test/express-image:1.0
    ports:
    - name: http1
      containerPort: 8080
    resources:
      limits:
        memory: 256Mi
        cpu: 1000m 

所以,我们需要暴露相同的8080端口或者更改yaml文件中的containerPort并重新部署。

Here is more about that:

我在 dockerfile 中公开了一个 PORT ,删除它会自动解决我的问题。 Google 注入 PORT 环境变量,因此项目将获取该环境变量。