容器无法启动。无法启动并监听 PORT 环境变量定义的端口

Posted

技术标签:

【中文标题】容器无法启动。无法启动并监听 PORT 环境变量定义的端口【英文标题】:Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable 【发布时间】:2019-09-03 20:15:40 【问题描述】:

我构建了我的容器映像,但是当我尝试从 gcloud 命令行或 Cloud Console 部署它时,我收到以下错误:“容器无法启动。无法启动然后侦听定义的端口通过 PORT 环境变量。”

【问题讨论】:

【参考方案1】:

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

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

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

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

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))

【讨论】:

将此“ENV PORT 8080 ENV HOST 0.0.0.0”添加到 dockerfile 不是一个好主意?像这样paste.ubuntu.com/p/ccKB5khCyJ 如果我们不使用 express js only node js,代码是什么? 我们在哪里粘贴了快速代码?服务器.js?或码头文件配置可能?这样吗?scotch.io/tutorials/how-to-deploy-a-node-js-app-to-heroku 如何为 vue js 项目编写这个? github.com/Timtech4u/node-cloud-run-cd/blob/master/index.js 需要在 config/index.js 中找到 index.js 吗?【参考方案2】:

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

我有一个用 TypeScript 编写的 Node 应用程序。为了对应用程序进行 docker 化,我需要做的就是编译代码 tsc 并运行 docker build 但我虽然 gcloud 构建提交会处理这个问题,并按照 Dockerfile 建议的方式选择编译后的代码。 dockerignore 并将构建我的源代码并提交到存储库。

但它所做的只是复制我的源代码并提交到 Cloud Build,然后根据 Dockerfile 将我的源代码 docker 化,而不是对已编译的代码进行 docker 化。

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

请记住,每次将映像推送到存储库时,启用 Dockerfile 中的构建步骤会增加映像大小。它正在吞噬那里的空间,谷歌会为此向你收费。

【讨论】:

【参考方案3】:

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

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

【讨论】:

知道容器必须启动多长时间吗?【参考方案4】:

Cloud Run 正在生成默认 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:

【讨论】:

以上是关于容器无法启动。无法启动并监听 PORT 环境变量定义的端口的主要内容,如果未能解决你的问题,请参考以下文章

Heroku Node.js 错误 R10(启动超时)-> Web 进程在启动后 60 秒内无法绑定到 $PORT

运行多容器 Docker 的 AWS BeanStalk 环境无法启动健康:严重

Oracle11g监听器出现无法启动的问题!!!

Keycloak Docker 容器重启后无法启动

wsl2启动时无法添加自启动和加载环境变量的解决办法

pyspark 下 Spark Streaming 启动监听文件流 时报错及解决方法。