You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GCP Cloud Build指定Dockerfile production阶段却运行test阶段的解决方法

如何在Cloud Build中仅构建Docker多阶段构建的production阶段

我为NodeJS应用编写了多阶段Dockerfile,使用GCP Cloud Build部署时,明明在build步骤指定了--target production,但Cloud Build还是会运行所有阶段(包括test阶段),本地执行docker build --target production -t app .却正常。相关配置如下:

Dockerfile

ARG NODE_IMAGE=node:21.7.3-alpine
ARG PROJECT_NAME=app

FROM $NODE_IMAGE AS base
RUN apk --no-cache add dumb-init
RUN mkdir -p /home/node/$PROJECT_NAME && chown node:node /home/node/$PROJECT_NAME
WORKDIR /home/node/$PROJECT_NAME
USER node
RUN mkdir tmp

FROM base AS dependencies
COPY --chown=node:node . .
RUN npm ci

FROM dependencies AS test
ENV NODE_ENV=test
RUN npm run test

FROM dependencies AS build
RUN npm run build

FROM base AS production
ENV NODE_ENV=production
ENV PORT=$PORT
ENV HOST=$HOST
COPY --chown=node:node ./package*.json ./
RUN npm ci --production --omit="dev"
COPY --chown=node:node --from=build /home/node/$PROJECT_NAME/build .
EXPOSE $PORT
CMD ["dumb-init", "node", "bin/server.js"]

cloudbuild.yaml

steps:
  - name: gcr.io/cloud-builders/docker
    args: ['build', '--target', 'production' ,'-t', '$_AR_HOSTNAME/$PROJECT_ID/cloud-run-source-deploy/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA', '.']
    id: Build
  - name: gcr.io/cloud-builders/docker
    args:
      - push
      - >-
        $_AR_HOSTNAME/$PROJECT_ID/cloud-run-source-deploy/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA
    id: Push
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk:slim'
    args:
      - run
      - services
      - update
      - $_SERVICE_NAME
      - '--platform=managed'
      - >-
        --image=$_AR_HOSTNAME/$PROJECT_ID/cloud-run-source-deploy/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA
      - >-
        --labels=managed-by=gcp-cloud-build-deploy-cloud-run,commit-sha=$COMMIT_SHA,gcb-build-id=$BUILD_ID,gcb-trigger-id=$_TRIGGER_ID
      - '--region=$_DEPLOY_REGION'
      - '--quiet'
    id: Deploy
    entrypoint: gcloud
images:
  - >-
    $_AR_HOSTNAME/$PROJECT_ID/cloud-run-source-deploy/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA
options:
  substitutionOption: ALLOW_LOOSE
  logging: CLOUD_LOGGING_ONLY
substitutions:
  _DEPLOY_REGION: europe-west1
  _AR_HOSTNAME: europe-west1-docker.pkg.dev
  _TRIGGER_ID: 437633372d-82257-4822f-95223-48b16c3337741b
  _PLATFORM: managed
  _SERVICE_NAME: app
tags:
  - gcp-cloud-build-deploy-cloud-run
  - gcp-cloud-build-deploy-cloud-run-managed

解决方案

问题根源在Cloud Build的images字段——这个字段会自动触发Docker构建所有能生成镜像的阶段,完全无视你在build步骤里指定的target参数,这就是为什么Cloud Build会跑全阶段的原因。

解决方法很简单:

  • 直接删除cloudbuild.yaml中的images字段
    你的配置里已经有手动的docker build和docker push步骤了,images字段属于多余配置,删掉之后Cloud Build就只会执行你指定的build步骤,仅构建production阶段。

验证逻辑:本地执行正常是因为没有Cloud Build的images字段干预,删掉这个字段后,Cloud Build的行为就会和本地一致,只会构建到production阶段,不会触发独立的test阶段。

内容的提问来源于stack exchange,提问作者Kevin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:53:20