[ PROMPT_NODE_24812 ]
GCP Cloud Run
[ SKILL_DOCUMENTATION ]
# GCP Cloud Run
## 模式
### Cloud Run 服务模式
在 Cloud Run 上运行的容器化 Web 服务
**适用场景**:['Web 应用和 API', '需要特定运行时或库', '具有多个端点的复杂服务', '无状态容器化工作负载']
javascript
dockerfile
# Dockerfile - 用于更小镜像的多阶段构建
FROM node:20-slim AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:20-slim
WORKDIR /app
# 仅复制生产依赖
COPY --from=builder /app/node_modules ./node_modules
COPY src ./src
COPY package.json ./
# Cloud Run 使用 PORT 环境变量
ENV PORT=8080
EXPOSE 8080
# 以非 root 用户身份运行
USER node
CMD ["node", "src/index.js"]
javascript
// src/index.js
const express = require('express');
const app = express();
app.use(express.json());
// 健康检查端点
app.get('/health', (req, res) => {
res.status(200).send('OK');
});
// API 路由
app.get('/api/items/:id', async (req, res) => {
try {
const item = await getItem(req.params.id);
res.json(item);
} catch (error) {
console.error('Error:', error);
res.status(500).json({ error: 'Internal server error' });
}
});
// 优雅停机
process.on('SIGTERM', () => {
console.log('SIGTERM received, shutting down gracefully');
server.close(() => {
console.log('Server closed');
process.exit(0);
});
});
const PORT = process.env.PORT || 8080;
const server = app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`);
});
yaml
# cloudbuild.yaml
steps:
# 构建容器镜像
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/$PROJECT_ID/my-service:$COMMIT_SHA', '.']
# 推送容器镜像
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/$PROJECT_ID/my-service:$COMMIT_SHA']
# 部署到 Cloud Run
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: gcloud
args:
- 'run'
- 'deploy'
- 'my-service'
- '--image=gcr.io/$PROJECT_ID/my-service:$COMMIT_SHA'
- '--region=us-central1'
- '--platform=managed'
- '--allow-unauthenticated'
- '--memory=512Mi'
- '--cpu=1'
- '--min-instances=1'
- '--max-instances=100'
### Cloud Run 函数模式
事件驱动函数(原 Cloud Functions)
**适用场景**:['简单的事件处理器', 'Pub/Sub 消息处理', 'Cloud Storage 触发器', 'HTTP Webhook']
javascript
j