嗨,我有一个适用于我的 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 build 命令时,您会在相同的环境中运行它。
这是与 Cloud Build 的一个主要区别,因为 Cloud build 上的每次运行都是从干净的环境开始的。它不知道之前做过什么,以及构建了什么图像。
因此,您必须使用缓存机制在外部保存构建的状态,然后在另一次云构建中重新加载它。
要实现这一目标,Kaniko 是正确的工具。更多信息这里