Cloud Run 错误:容器无法启动

Posted

技术标签:

【中文标题】Cloud Run 错误:容器无法启动【英文标题】:Cloud Run error: Container failed to start 【发布时间】:2020-04-18 19:08:30 【问题描述】:

我未能将基本的 Angular 应用程序部署到 Google Cloud Run。该错误表明它在端口 8080 上未正确提供服务,但在我的机器 localhost:8080 上本地运行会显示该应用程序。那么,如果有人有任何想法,我可能需要一些额外的东西来运行云计算?

详情如下:

我创建了一个基本的 Angular 应用程序

ng new test-app

Dockerfile如下

FROM node:latest as node
WORKDIR /app
COPY . .

RUN npm install
RUN npm run build --prod

ENV PORT=8080

FROM nginx:latest
COPY --from=node /app/dist/test-app /usr/share/nginx/html
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]

我在本地运行构建的容器,我可以在 localhost:8080 看到它

docker container run -p 8080:80 gcr.io/$GOOGLE_PROJECT/test-app:$IMAGE

screenshot

然后我部署到 Google Cloud Run 托管。

gcloud run deploy test-app --image gcr.io/$GOOGLE_PROJECT/test-app:$IMAGE --platform managed

但是启动失败,报错

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.

日志中没有其他错误。

谢谢。

我从How to change the port of nginx when using with docker那里得到的有效解决方案

我创建了 nginx.conf 文件,将端口设置为 8080 并将服务器设置为 0.0.0.0

# on alpine, copy to /etc/nginx/nginx.conf
user                            root;
worker_processes                auto;

error_log                       /var/log/nginx/error.log warn;

events 
    worker_connections          1024;


http 
    include                     /etc/nginx/mime.types;
    default_type                application/octet-stream;
    sendfile                    off;
    access_log                  off;
    keepalive_timeout           3000;
    server 
        listen                  8080;
        root                    /usr/share/nginx/html;
        index                   index.html;
        server_name             0.0.0.0;
        client_max_body_size    16m;
    

并更新了 Dockerfile 以复制此文件。

FROM node:latest as node
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build --prod

ENV PORT=8080

FROM nginx:alpine
COPY --from=node /app/dist/streamin-app/ /usr/share/nginx/html/
COPY nginx.conf /etc/nginx/
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]

【问题讨论】:

您可能想研究以下内容...***.com/questions/56318026/…...我的理解是您不能在端口 8080 上监听...但是您必须监听端口中的任何内容环境变量...引用的 Q/A 显示了如何在开始使用正确的端口之前修改 nginx。 【参考方案1】:

我认为与在所有网络接口上侦听的容器有关。

根据官方文档:

Cloud Run 服务无法启动的一个常见原因是 容器内的服务器进程被配置为监听 本地主机(127.0.0.1)地址。这是指环回网络 接口,不能从容器外部访问,并且 因此无法执行 Cloud Run 运行状况检查,导致 服务部署失败。

要解决这个问题,请将您的应用程序配置为启动 HTTP 服务器以 监听所有网络接口,通常表示为 0.0.0.0。

【讨论】:

真正的解决方案在哪里?你为此写了什么代码,什么脚本更新? 谢谢,这对我有用。我正在使用 FastAPI python 并添加 --host 0.0.0.0 解决了我的问题。 在经历了一天可怕的痛苦之后,就是这样!不敢相信 Google 文档没有提及它,并且日志是如此神秘,因为服务器仍在启动。对于 Fastify 用户 - fastify.listen(port, '0.0.0.0')【参考方案2】:
    顺便说一句,我根本没有弄乱 nginx 我的 docker 文件中只有 EXPOSE 4200 我在这里将容器端口 4200 添加到容器的设置中:

然后它在顶部给了我一个 URL:

这给了我一个无效的主机头错误,我通过重新部署我的容器来修复它:

CMD ng serve --host 0.0.0.0 --disable-host-check

查看对此here的讨论。

【讨论】:

【参考方案3】:

“docker 容器运行 -p 8080:80 gcr.io/$GOOGLE_PROJECT/test-app:$IMAGE”

显示您将本地计算机的端口 8080 映射到映像的端口 80,这表明您的映像正在侦听端口 80。

您可以 1) 更改映像或 2) 使用自定义端口部署到云运行:

gcloud alpha run deploy ... -port 80

【讨论】:

以上是关于Cloud Run 错误:容器无法启动的主要内容,如果未能解决你的问题,请参考以下文章

Docker容器上传到gcp cloud-run,核心Web api应用程序不起作用

docker 容器自动启动run

输入使用 Google Cloud Run 运行的 docker 容器

GCP Cloud 运行容器服务:[pool www] 无法写入套接字 '/run/php-fpm/www.sock' 的 ACL

Docker因配置错误无法启动容器时该咋整

idea 启动spring-cloud console 台报错: 错误: 找不到或无法加载主类