首页 > 解决方案 > 在提交时自动更新我的 package.json 是否会禁用 docker build 以重用缓存?

问题描述

我刚刚开始深入了解 dockerfile 语法。

这是我目前使用的一个:

FROM node:12-alpine as install

WORKDIR /Backend-graphql
COPY ./src ./src
COPY ./index.js ./index.js
COPY ./schema.graphql ./schema.graphql
COPY ./package.json ./
COPY ./package-lock.json ./package-lock.json
RUN npm install

FROM node:12-alpine as prismawork

WORKDIR /PrismaWork
COPY --from=install /Backend-graphql .
COPY ./datamodel.prisma ./datamodel.prisma
COPY ./prisma.yml ./prisma.yml
RUN npx prisma deploy
RUN npx prisma generate

FROM node:12-alpine
#curl needed for healthcheck
RUN apk --update --no-cache add curl
WORKDIR /app
COPY --from=prismawork /PrismaWork .
ENTRYPOINT ["npm", "start"]
EXPOSE 4000

从网上发现的人员测试和文档中,我尊重以下建议:

但我注意到一些事情,docker 在当前和后续构建阶段的第一个 COPY 层不同之后不重用缓存。而且我认为这是一个问题,因为我使用了一个基于提交消息语义版本控制语法的自动凹凸版本 git 钩子,它修改了我的 package.json。因此,在每次提交时 docker build 重新运行 npm install 和后续层。

首先,我了解 docker 缓存分层系统吗?

其次,我应该使用其他文件来自动升级版本并在我的 Dockerfile 的最后复制它吗?

标签: dockercachingnpmdocker-build

解决方案


首先,我了解docker缓存分层系统了吗?

是的你应该。如果任何步骤发生任何更改,例如 package.json 中的更改,docker 将重建其余步骤。

无需多次从同一图像复制。在执行不相关的步骤以捕获其他步骤之后,我们也在执行 npm install。

FROM node:12-alpine
#curl needed for healthcheck
RUN apk --update --no-cache add curl
WORKDIR /app
COPY ./src ./src
COPY ./index.js ./index.js
COPY ./schema.graphql ./schema.graphql
COPY ./datamodel.prisma ./datamodel.prisma
COPY ./prisma.yml ./prisma.yml
COPY ./package.json ./
COPY ./package-lock.json ./package-lock.json
RUN npm install
RUN npx prisma deploy
RUN npx prisma generate
ENTRYPOINT ["npm", "start"]
EXPOSE 4000

当您需要在多个图像之间构建时,多阶段很有用,如下例所示:

FROM node:12-alpine
RUN npm install -g gzipper
WORKDIR /build
ADD . .
RUN npm install
ARG CONFIGURATION
RUN npm run build:${CONFIGURATION}
RUN gzipper --gzip-level=6 ./dist

FROM nginx:latest
WORKDIR /usr/share/nginx/html
COPY --from=0 /build/dist .
COPY nginx/default.conf /etc/nginx/conf.d/default.conf

推荐阅读