在 GCP Cloudbuild 中构建多阶段 Dockerfile

问题描述 投票:0回答:1

嗨,我有一个适用于我的 NodeJS 应用程序的 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" ]

我正在使用 Google Cloud Platform 和 Cloud Build 来部署我的应用程序。 这是我的

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

我想在云构建中定位 docker build

production
阶段,但它似乎运行每个步骤,并且我也运行
test
阶段。

我怎样才能实现这一目标?

尝试在本地计算机中定位步骤时没有遇到此问题

docker build --target production -t app .
docker build --target test -t app-test .
docker run -d --name app --restart always -p 3333:3333 --env-file .env app
docker google-cloud-platform google-cloud-build cloudbuild.yaml
1个回答
0
投票

在您的示例中,当您连续运行 docker build 命令时,您会在相同的环境中运行它。

这是与 Cloud Build 的一个主要区别,因为 Cloud build 上的每次运行都是从干净的环境开始的。它不知道之前做过什么,以及构建了什么图像。

因此,您必须使用缓存机制在外部保存构建的状态,然后在另一次云构建中重新加载它。

要实现这一目标,Kaniko 是正确的工具。更多信息这里

© www.soinside.com 2019 - 2024. All rights reserved.