为 Cloud Run 部署公开 8080 和 3000 端口

Posted

技术标签:

【中文标题】为 Cloud Run 部署公开 8080 和 3000 端口【英文标题】:Expose Both Ports 8080 and 3000 For Cloud Run Deployment 【发布时间】:2020-08-04 21:37:09 【问题描述】:

TL:DR - 我正在尝试将我的 MERN 堆栈应用程序部署到 GCP 的 Cloud Run。我认为这是一个端口问题。

我的 React 应用程序位于 我的 Node.js 应用程序的 client 文件夹中。

这是我的一个Dockerfile 来运行前端和后端:

FROM node:13.12.0-alpine
WORKDIR /app
COPY . ./

# Installing components for be connector
RUN npm install --silent  
WORKDIR /app/client
RUN npm install --silent

WORKDIR /app
RUN chmod +x /app/entrypoint.sh
ENTRYPOINT [ "/app/entrypoint.sh" ]

...这是我的entrypoint.sh 文件:

#!/bin/sh
node /app/index.js &
cd /app/client
npm start

docker-compose up 在本地工作,docker run -p 8080:8080 -p 3000:3000 <image_id> 运行我构建的镜像。端口 8080 用于 Node,端口 3000 用于 React 应用程序。但是,在 Cloud Run 上,该应用程序无法运行。当我访问部署到 Cloud Run 的应用时,前端最初会加载一瞬间,但随后应用在尝试向 API 发出请求时崩溃。

高级设置中,有一个默认为 8080 的容器端口。我尝试将其更改为 3000,但都不起作用。我无法输入 8080,3000,因为该字段仅对端口采用有效整数。是否可以像这样同时将 React + Node 部署到 Cloud Run?如何让 Cloud Run 在 8080 和 3000 上同时收听,而不是 2 个中的一个?

谢谢!

【问题讨论】:

【参考方案1】:

目前不可能。

相反,您可以run multiple processes inside Cloud Run,而是使用 nginx 根据 URL 代理它们之间的请求,类似于this answer 中的建议。

【讨论】:

嗯好吧。为节点和反应单独使用单独的 docker 映像和单独的云运行会更好吗? 可能,这是在单个容器中进行更多配置与为两个独立服务重复部署过程之间的权衡。 通常最好将不同的进程拆分到不同的容器中。可悲的是,在容器内将应用程序分叉到后台,如 foo & 是一种恶意使用模式,具有许多缺点。我在我的博文ahmet.im/blog/minimal-init-process-for-containers 中讨论了其中一些。

以上是关于为 Cloud Run 部署公开 8080 和 3000 端口的主要内容,如果未能解决你的问题,请参考以下文章

配置 Cloud Run on Anthos 以转发 HTTP2

Cloud Run 上的容器内存管理和 OOM

Docker 映像在本地部署,但在 Google Cloud Run 上失败

如何获取或生成Google Cloud Run服务的部署URL

Ingress-Nginx-Controller未能找到部署在Google Cloud Platform上的第二项服务

公开课预告:如何借助Google Cloud在海外部署音视频业务?