Cloud Run error: Container failed to start. Running a background task without exposing a PORT or URL
Cloud Run error: Container failed to start. Running a background task without exposing a PORT or URL
我遇到了这个问题
(gcloud.run.deploy) 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.
有几个 post 有这个错误,但我找不到我的具体情况。
我正在 运行 执行后台任务,没有什么可暴露的,它连接到 firebase 处理一些数据并将其存储回去。我希望这个过程在云 运行 上的容器上 运行 所以我把它变成了一个容器,它在本地完美地 运行,但是当它上传到 CR 时它失败并出现上述错误。
我试图在 dockerfile 上公开 8080 和其他一些东西,但是如果你尝试连接到它们的容器,它没有服务器 运行 连接到。这是一个批处理任务。
任何人都可以告诉我是否可以将此类任务上传到云端 运行,我不知道如何解决这个问题。我不相信 google 需要容器上的服务器 运行ning 才能允许它,我看到一些 posts 的开发人员在图像上拉了一个 nginx,这样他们就可以公开端口,但这会对我来说完全没有必要。
感谢您的建议
更新
- Cloud Logging:错误只是说无法启动容器,这很有趣,因为容器启动并显示一些日志,好像它正在工作但随后停止。
- 基于 MAC 是。
- DockerFile 非常简单。
FROM openjdk:11
ENV NOTIFIER_HOME /opt/app/
ENV NOTIFIER_LOGS /opt/notifications/logs/
RUN mkdir -p $NOTIFIER_HOME RUN mkdir -p $NOTIFIER_LOGS
RUN apt update
#RUN apt install curl
COPY docker/* $NOTIFIER_HOME
EXPOSE 8080
ENV TMP_OPTS -Djava.io.tmpdir=/tmp ENV LOG4j_OPTS
-Dlog4j.configurationFile=$NOTIFIER_HOME/logback.xml ENV NOTIFIER_OPTS $TMP_OPTS $LOG4j_OPTS
ENV JAVA_GC_OPTS -Xms1g -Xmx1g
WORKDIR $NOTIFIER_HOME ENTRYPOINT ["sh", "-c", "/opt/app/entrypoint.sh"]
我 运行 在 MAC 上构建自定义图像 + 部署到云端 运行 时遇到了类似的问题。就我而言,结果是 docker 平台导致了问题。我隔离它的方法是在 Cloud Shell 中构建相同的图像,这在 Cloud 运行.
中可以很好地工作
现在,如果您需要在 MAC 上本地构建它,请继续并通过更改 Docker 平台来测试它:
export DOCKER_DEFAULT_PLATFORM=linux/amd64
docker build -t mytag:myver .
构建镜像后,您可以检查架构:
docker image inspect mytag:myver | grep -i Architecture
然后将其部署到云端运行。
解释在你的问题中:
I am running a background task, nothing to expose
云 运行 应用程序,即您的容器,必须按照 Container runtime contract. That's why in all cloud run examples, java in your case, spring boot is used with @RestController
. Other explanation can be found in .
中所述侦听传入的 HTTP 请求
更新:
所以解决方案是
- 将网络服务器添加到您的代码中并使用 spring 启动和控制器逻辑包装它
- 使用 Cloud Function 而不是 Cloud 运行 并摆脱 Dockerfile,同时代码更简单,配置更少
您不能 运行 Cloud 运行 上的后台作业。如果过程花费的时间少于 1 小时,请按照 MBHA 的建议将其包装在网络服务器中。
否则,您可以使用 GKE Autopilot 运行 您的容器一段时间。您只需在您的容器 运行 时付款。第一个集群是免费的。你可以试试看!
作为 hack,您也可以 运行 您在 Cloud Build 中的容器,或在 Vertex AI 自定义容器培训中。
我遇到了这个问题
(gcloud.run.deploy) 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.
有几个 post 有这个错误,但我找不到我的具体情况。
我正在 运行 执行后台任务,没有什么可暴露的,它连接到 firebase 处理一些数据并将其存储回去。我希望这个过程在云 运行 上的容器上 运行 所以我把它变成了一个容器,它在本地完美地 运行,但是当它上传到 CR 时它失败并出现上述错误。
我试图在 dockerfile 上公开 8080 和其他一些东西,但是如果你尝试连接到它们的容器,它没有服务器 运行 连接到。这是一个批处理任务。
任何人都可以告诉我是否可以将此类任务上传到云端 运行,我不知道如何解决这个问题。我不相信 google 需要容器上的服务器 运行ning 才能允许它,我看到一些 posts 的开发人员在图像上拉了一个 nginx,这样他们就可以公开端口,但这会对我来说完全没有必要。
感谢您的建议
更新
- Cloud Logging:错误只是说无法启动容器,这很有趣,因为容器启动并显示一些日志,好像它正在工作但随后停止。
- 基于 MAC 是。
- DockerFile 非常简单。
FROM openjdk:11 ENV NOTIFIER_HOME /opt/app/ ENV NOTIFIER_LOGS /opt/notifications/logs/ RUN mkdir -p $NOTIFIER_HOME RUN mkdir -p $NOTIFIER_LOGS RUN apt update #RUN apt install curl COPY docker/* $NOTIFIER_HOME EXPOSE 8080 ENV TMP_OPTS -Djava.io.tmpdir=/tmp ENV LOG4j_OPTS -Dlog4j.configurationFile=$NOTIFIER_HOME/logback.xml ENV NOTIFIER_OPTS $TMP_OPTS $LOG4j_OPTS ENV JAVA_GC_OPTS -Xms1g -Xmx1g WORKDIR $NOTIFIER_HOME ENTRYPOINT ["sh", "-c", "/opt/app/entrypoint.sh"]
我 运行 在 MAC 上构建自定义图像 + 部署到云端 运行 时遇到了类似的问题。就我而言,结果是 docker 平台导致了问题。我隔离它的方法是在 Cloud Shell 中构建相同的图像,这在 Cloud 运行.
中可以很好地工作现在,如果您需要在 MAC 上本地构建它,请继续并通过更改 Docker 平台来测试它:
export DOCKER_DEFAULT_PLATFORM=linux/amd64
docker build -t mytag:myver .
构建镜像后,您可以检查架构:
docker image inspect mytag:myver | grep -i Architecture
然后将其部署到云端运行。
解释在你的问题中:
I am running a background task, nothing to expose
云 运行 应用程序,即您的容器,必须按照 Container runtime contract. That's why in all cloud run examples, java in your case, spring boot is used with @RestController
. Other explanation can be found in
更新: 所以解决方案是
- 将网络服务器添加到您的代码中并使用 spring 启动和控制器逻辑包装它
- 使用 Cloud Function 而不是 Cloud 运行 并摆脱 Dockerfile,同时代码更简单,配置更少
您不能 运行 Cloud 运行 上的后台作业。如果过程花费的时间少于 1 小时,请按照 MBHA 的建议将其包装在网络服务器中。
否则,您可以使用 GKE Autopilot 运行 您的容器一段时间。您只需在您的容器 运行 时付款。第一个集群是免费的。你可以试试看!
作为 hack,您也可以 运行 您在 Cloud Build 中的容器,或在 Vertex AI 自定义容器培训中。