Cloud Build使用两个Dockerfile复用中间镜像解决Cloud Run部署超时问题
适配需求的cloudbuild.yaml完整配置
steps: # 1. 复制对应服务源码到工作目录 - name: 'bash' args: - '-c' - | echo 'Creating gcr_source directory for ${_GCR_NAME}' mkdir _gcr_source cp -r cloudruns/${_GCR_NAME}/. _gcr_source # 2. 尝试拉取已有的prophet基础镜像,判断是否需要重新构建 - name: 'gcr.io/cloud-builders/docker' id: 'check-base-image' allowFailure: true args: ['pull', 'gcr.io/$PROJECT_ID/prophet-base:latest'] dir: '_gcr_source' # 3. 仅当基础镜像不存在时,构建并推送prophet基础镜像(对应Dockerfile_one) - name: 'gcr.io/cloud-builders/docker' id: 'build-base-image' waitFor: ['check-base-image'] entrypoint: 'bash' args: - '-c' - | # 上一步pull失败返回码非0时才执行构建 if [ $? -ne 0 ]; then docker build -f Dockerfile.one -t gcr.io/$PROJECT_ID/prophet-base:latest . docker push gcr.io/$PROJECT_ID/prophet-base:latest fi dir: '_gcr_source' # 4. 基于基础镜像构建最终业务镜像(对应Dockerfile_two) - name: 'gcr.io/cloud-builders/docker' waitFor: ['build-base-image'] args: ['build', '-f', 'Dockerfile.two', '-t', 'gcr.io/$PROJECT_ID/${_GCR_NAME}', '.'] dir: '_gcr_source' # 5. 推送最终业务镜像到镜像仓库 - name: 'gcr.io/cloud-builders/docker' args: ['push', 'gcr.io/$PROJECT_ID/${_GCR_NAME}'] # 6. 部署到Cloud Run - name: 'gcr.io/cloud-builders/gcloud' entrypoint: gcloud args: - run - deploy - ${_GCR_NAME} - --image=gcr.io/$PROJECT_ID/${_GCR_NAME} # 可根据需要补充Cloud Run其他参数,如区域、内存限制、允许未授权访问等 # - --region=us-central1 # - --memory=2Gi # - --allow-unauthenticated # 配置Cloud Build超时时间,避免基础镜像首次构建超时 timeout: 3600s images: - 'gcr.io/$PROJECT_ID/prophet-base:latest' - 'gcr.io/$PROJECT_ID/${_GCR_NAME}'
配置说明
- 基础镜像默认使用固定标签
prophet-base:latest,如果需要多版本管理可自行修改标签规则 - 你需要将拆分后的两个Dockerfile分别命名为
Dockerfile.one和Dockerfile.two,存放到cloudruns/${_GCR_NAME}/目录下 - 首次构建时会自动拉取基础镜像失败,触发基础镜像构建,后续构建只要基础镜像存在就会直接跳过构建步骤
- 全局超时配置为1小时,避免Prophet首次编译依赖时间过长导致构建超时
注意事项
如果后续需要更新Prophet版本或者基础镜像的依赖,只需要手动删除GCR里的prophet-base:latest镜像,下次构建就会自动重新构建基础镜像。
内容的提问来源于stack exchange,提问作者syldman
相关产品推荐
相关产品推荐

