【问题标题】:Cloud Run Deploy fails: Container failed to start. Failed to start and then listen on the port defined by the PORT environment variableCloud Run Deploy 失败:容器无法启动。无法启动并监听 PORT 环境变量定义的端口
【发布时间】:2021-11-10 01:49:03
【问题描述】:

我有一个项目,我之前已成功部署到 Google Cloud Run,并设置了一个触发器,以便在推送到 Github 上 repo 的主分支时,它会自动部署。效果很好。

然后我尝试重命名 github repo,这意味着删除并创建一个新触发器,现在我无法让它再次工作。

每次构建成功,但部署失败,并在 Cloud Build 中出现此错误:

第 2 步 - “部署”:错误:(gcloud.run.services.update) Cloud Run 错误:容器无法启动。无法启动并侦听 PORT 环境变量定义的端口。此修订的日志可能包含更多信息。

除了 repo 名称之外,我没有更改任何其他内容,这让我相信我的代码无法解决这个问题,但我还是尝试了一些更改。

我已经研究了this 帖子中提出的解决方案。但是,我相信我正在侦听正确的端口。

我的应用正在使用 Python 和 Flask,并且包含以下内容:

if __name__ == "__main__":
    app.run(debug=False, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

应该使用 ENV var Port (8080),否则默认使用 8080。我也尝试使用 port=8080。

我尝试在 Dockerfile 中显式公开端口,但也没有用:

FROM python:3.7
   
#Copy files into docker image dir, and make that the current working dir
COPY . /docker-image
WORKDIR /docker-image

RUN pip install -r requirements.txt

CMD ["flask", "run", "--host", "0.0.0.0"]

EXPOSE 8080

Cloud Run 似乎确实在使用端口 8080 - 如果我深入研究响应,我会看到它嵌套在 Response.spec.container.0 下:

ports: [
  0: {
    containerPort: 8080
    name: "http1"
  }
]

话虽如此,如果我查看日志,它会显示“现在在端口 5000 上运行”。

我不知道端口 5000 来自何处或被设置,但尝试将 Python/Flask 和 Dockerfile 中的端口更改为 5000 会导致相同的错误。

如何让它在 8080 端口上运行?在重命名回购和创建新触发器之前,这对我来说非常奇怪。这个设置有何不同?触发器没有提供设置端口的选项,所以我不确定这是如何导致此错误的。

【问题讨论】:

  • 显示部署 Cloud Run 服务的命令或构建步骤。您可以通过 gcloud 命令行选项 --port=8080 指定端口号。
  • 当我推送到 githhub 时它会自动启动,所以我没有那样指定它。我基于此确认它位于端口 8080:cloud.google.com/run/docs/configuring/containers#console 但是,当您进行 github 集成以进行部署时,可能未使用该设置
  • 如果您在控制台 GUI 中配置了部署操作,那么您还配置了端口号。您的文档链接显示了该步骤。 cloud.google.com/run/docs/configuring/containers#console

标签: port google-cloud-run google-cloud-build


【解决方案1】:

你有混合的东西。 Flask 命令默认端口实际上是 5000。如果要更改它,您需要使用 --port= 参数更改您的烧瓶运行命令

CMD ["flask", "run", "--host", "0.0.0.0","--port","8080"]

此外,您的烧瓶运行命令是烧瓶运行时,完全忽略标准 python 入口点if __name__ == "__main__":。如果要使用此入口点,请使用 Python 运行时

CMD ["python", "<main file>.py"]

【讨论】:

  • 我走了第二条路,将 Dockerfile 更改为指向 main.py,现在它可以工作了!谢谢!我仍然感到好奇的是,据我所知,以前的设置用于处理旧的 repo - 我认为它以某种方式忽略了 CMD [“flask”...] 并使用了 python ......但我以前在工作时确实有两种“混合”方法。奇怪!
  • 作为后续,使用一种方法相对于另一种方法是否有特别的优势/劣势?有什么特别的原因我可能想将其更改为让 Docker 运行烧瓶吗?
  • 很遗憾,我不是 python 专家,也不知道两者之间的区别。这可能是另一个很好的问题!
猜你喜欢
  • 2021-11-10
  • 2021-10-07
  • 2019-09-03
  • 2021-05-24
  • 2021-05-13
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
相关资源
最近更新 更多