容器启动失败。无法启动,然后监听 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并重新部署。
我在 dockerfile 中公开了一个 PORT ,删除它会自动解决我的问题。 Google 注入 PORT 环境变量,因此项目将获取该环境变量。
我构建了容器映像,但当我尝试从 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并重新部署。
我在 dockerfile 中公开了一个 PORT ,删除它会自动解决我的问题。 Google 注入 PORT 环境变量,因此项目将获取该环境变量。