在提交时自动更新我的 package.json 是否会禁用 docker 构建以重用缓存?
Does automatically updating my package.json at commit time disable docker build to reuse cache?
我刚刚开始深入了解 docker 文件语法。
这是我目前使用的:
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 层之后,当前和后续构建阶段不同,不要重用缓存。而且我认为这是一个问题,因为我使用了一个 automatic bump version git 挂钩,它基于提交消息语义版本化语法 修改了我的 package.json。因此,在每次提交时 docker 重新构建 运行 npm install 和后续层。
首先,我了解docker缓存分层系统了吗?
其次,我是否应该使用其他文件进行自动升级版本并将其复制到我的 Dockerfile 的末尾?
First of all, have I understood docker cache layering system?
是的,你应该。
如果任何步骤发生任何更改,例如 package.json 中的更改,docker 将重建其余步骤。
无需多次复制同一张图片。我们还在执行不相关的步骤以捕获其他步骤后进行 npm 安装。
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
我刚刚开始深入了解 docker 文件语法。
这是我目前使用的:
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 层之后,当前和后续构建阶段不同,不要重用缓存。而且我认为这是一个问题,因为我使用了一个 automatic bump version git 挂钩,它基于提交消息语义版本化语法 修改了我的 package.json。因此,在每次提交时 docker 重新构建 运行 npm install 和后续层。
首先,我了解docker缓存分层系统了吗?
其次,我是否应该使用其他文件进行自动升级版本并将其复制到我的 Dockerfile 的末尾?
First of all, have I understood docker cache layering system?
是的,你应该。 如果任何步骤发生任何更改,例如 package.json 中的更改,docker 将重建其余步骤。
无需多次复制同一张图片。我们还在执行不相关的步骤以捕获其他步骤后进行 npm 安装。
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