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
相关产品推荐
相关产品推荐

