Google Cloud Build构建耗时优化咨询:Docker配置场景
优化Google Cloud Build构建耗时的实战方案
当前使用Google Cloud Build触发分支推送构建,Cloud Run服务运行正常,但构建耗时超10分钟(本地带缓存仅需10秒),以下针对你的配置给出针对性优化方案:
现有配置
cloudbuild.yaml
steps: - name: gcr.io/cloud-builders/docker args: - build - '-f' - 'Dockerfile' - '-t' - '${_IMG_REGION}-docker.pkg.dev/$PROJECT_ID/${_IMG_REPO}/${_IMG_NAME}:$SHORT_SHA' - . - name: gcr.io/cloud-builders/docker args: - push - '${_IMG_REGION}-docker.pkg.dev/$PROJECT_ID/${_IMG_REPO}/${_IMG_NAME}:$SHORT_SHA' - name: gcr.io/google.com/cloudsdktool/cloud-sdk args: - run - deploy - '${_RUN_SERVICE}' - '--image=${_IMG_REGION}-docker.pkg.dev/$PROJECT_ID/${_IMG_REPO}/${_IMG_NAME}:$SHORT_SHA' - '--region=${_RUN_REGION}' - '--service-account=${_ACCOUNT_EMAIL}' - '--platform=managed' - '--ingress=internal-and-cloud-load-balancing' - '--concurrency=200' - '--timeout=600' - '--min-instances=1' - '--max-instances=2' - '--cpu=1' - '--memory=256Mi' - '--cpu-boost' - '--cpu-throttling' entrypoint: gcloud images: - '${_IMG_REGION}-docker.pkg.dev/$PROJECT_ID/${_IMG_REPO}/${_IMG_NAME}:$SHORT_SHA'
Dockerfile
FROM node:20.5.1-alpine AS step1 LABEL version="23.10.01" WORKDIR /temp COPY package.json . RUN npm install COPY ./tsconfig.json . COPY src/ ./src RUN npm run build FROM node:20.5.1-alpine AS step2 WORKDIR /app/ COPY package.json . RUN npm install --omit=dev && npm cache clean --force COPY --from=step1 /temp/build ./build ENV NODE_ENV production ENV APP_ENV dev EXPOSE $PORT CMD [ "npm", "run", "start:prod" ]
一、Dockerfile层面优化(最大化层缓存利用率)
锁定依赖版本,添加lock文件到缓存层
仅复制package.json会导致依赖未变更时仍可能重新执行npm install,补充lock文件可稳定缓存:# step1阶段 WORKDIR /temp COPY package.json package-lock.json ./ RUN npm install # 后续步骤不变... # step2阶段 WORKDIR /app/ COPY package.json package-lock.json ./ RUN npm install --omit=dev && npm cache clean --force优化npm安装速度
- 添加
--no-fund --no-audit跳过非必要检查:RUN npm install --no-fund --no-audit # 生产环境安装同理 RUN npm install --omit=dev --no-fund --no-audit && npm cache clean --force - 用
npm ci替代npm install(需lock文件存在),严格按lock文件安装,速度更快且版本一致:RUN npm ci --no-fund --no-audit # 生产环境 RUN npm ci --omit=dev --no-fund --no-audit && npm cache clean --force
- 添加
合并COPY指令减少层数
把tsconfig.json和src/的复制合并,不影响缓存同时减少镜像层数:COPY ./tsconfig.json ./src/ ./
二、Cloud Build层面优化(启用构建缓存)
启用Docker层缓存(核心优化)
默认Cloud Build无缓存,添加--cache-from复用已推送的镜像层:- name: gcr.io/cloud-builders/docker args: - build - '-f' - 'Dockerfile' - '-t' - '${_IMG_REGION}-docker.pkg.dev/$PROJECT_ID/${_IMG_REPO}/${_IMG_NAME}:$SHORT_SHA' # 复用latest和当前SHA版本作为缓存源 - '--cache-from=${_IMG_REGION}-docker.pkg.dev/$PROJECT_ID/${_IMG_REPO}/${_IMG_NAME}:latest' - '--cache-from=${_IMG_REGION}-docker.pkg.dev/$PROJECT_ID/${_IMG_REPO}/${_IMG_NAME}:$SHORT_SHA' - .同时推送
latest标签镜像,方便后续构建复用:# 新增tag并推送latest版本的步骤 - name: gcr.io/cloud-builders/docker args: - tag - '${_IMG_REGION}-docker.pkg.dev/$PROJECT_ID/${_IMG_REPO}/${_IMG_NAME}:$SHORT_SHA' - '${_IMG_REGION}-docker.pkg.dev/$PROJECT_ID/${_IMG_REPO}/${_IMG_NAME}:latest' - name: gcr.io/cloud-builders/docker args: - push - '${_IMG_REGION}-docker.pkg.dev/$PROJECT_ID/${_IMG_REPO}/${_IMG_NAME}:latest'使用更高配置的构建机器
默认机器为n1-standard-1,换成高CPU机器可加快构建:options: machineType: 'N1_HIGHCPU_8' # 8核CPU,适配npm安装、代码编译等CPU密集任务启用Cloud Build本地缓存
缓存npm依赖等文件,进一步减少重复操作:options: machineType: 'N1_HIGHCPU_8' diskSizeGb: 50 # 增大磁盘避免缓存溢出 cache: paths: - /root/.npm # 缓存npm全局依赖 - /temp/node_modules # 缓存step1的依赖包 - /app/node_modules # 缓存step2的依赖包
三、其他优化小技巧
- 移除冗余命令:
npm ci本身不会留下缓存文件,可删除npm cache clean --force节省时间 - 依赖变更触发完整构建:仅当
package.json/package-lock.json变更时,才会重新执行npm install,代码变更会直接复用缓存层
内容的提问来源于stack exchange,提问作者crivella
相关产品推荐
相关产品推荐

