NestJS部署Cloud Run生产环境:如何传入.env.prod至docker-compose
用Docker、docker-compose部署NestJS到Cloud Run生产环境的方案
核心步骤:将.env.prod传入docker-compose并部署
1. 调整docker-compose.yml适配生产环境变量
确保你的docker-compose.yml正确指定加载生产环境配置:
version: '3.8' services: nest-app: build: . env_file: - .env.prod # 明确加载生产环境变量文件 ports: - "3000:3000" restart: always
注:Cloud Run会自动管理端口映射,这里的端口配置仅用于本地调试,部署时Cloud Run会覆盖为你指定的服务端口(建议在Dockerfile中提前暴露3000端口)。
2. 优化Dockerfile适配生产构建
针对NestJS采用多阶段构建,大幅缩小镜像体积:
# 构建阶段:安装所有依赖并编译代码 FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # 生产阶段:仅保留生产依赖和编译后的代码 FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY --from=builder /app/dist ./dist EXPOSE 3000 CMD ["node", "dist/main.js"]
这种构建方式能让镜像只包含运行必需的文件,加快Cloud Run的启动速度。
3. 部署到Cloud Run的两种可行方式
方式一:直接用gcloud CLI部署(单服务场景首选)
Cloud Run原生不支持docker-compose.yml,但可以跳过docker-compose,直接构建镜像推送到Google Artifact Registry后部署:
- 构建并推送镜像:
gcloud builds submit --tag us-central1-docker.pkg.dev/[你的项目ID]/[仓库名]/nest-app:prod - 部署时传入.env.prod变量(或直接在Cloud Run控制台配置):
gcloud run deploy nest-prod-service \ --image us-central1-docker.pkg.dev/[你的项目ID]/[仓库名]/nest-app:prod \ --region us-central1 \ --platform managed \ --env-vars-file .env.prod \ --allow-unauthenticated # 按需配置是否允许公共访问
这种方式贴合Cloud Run的无服务器工作流,避免不必要的复杂度。
方式二:docker-compose配合Cloud Run(多服务场景可选)
如果有多个服务需要协同部署,可先用docker-compose build构建所有镜像,逐个推送到镜像仓库后,再分别部署到Cloud Run。不过单服务场景不推荐,Cloud Run针对单服务的弹性扩缩容和资源调度更高效。
最佳实践
- 敏感变量管理:不要把.env.prod提交到代码仓库,建议用Cloud Run的环境变量配置功能,或Google Secrets Manager存储数据库密码、API密钥等敏感信息,部署时挂载:
gcloud run deploy nest-prod-service \ --image [镜像地址] \ --update-secrets DB_PASSWORD=projects/[项目ID]/secrets/[密钥名]:latest - 健康检查配置:在NestJS中添加
/health这类健康检查端点,在Cloud Run控制台配置健康检查路径,确保服务异常时能自动重启。 - CI/CD自动化:配置Cloud Build触发器,当代码推送到生产分支(如main)时,自动构建镜像并部署到Cloud Run,实现一键发布。
- 资源按需配置:根据服务负载调整Cloud Run的CPU、内存配额,设置合理的自动扩缩容规则,平衡性能和成本。
内容的提问来源于stack exchange,提问作者BaoTrung Tran
相关产品推荐
相关产品推荐

