docker - 在提交时自动更新我的 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 的最后复制它吗?
解决方案
首先,我了解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
推荐阅读
- templates - Ansible/Jinja2 模板:for 循环运行两次
- reactjs - 提交表单后设置内容为空
- ios - 如何快速从 UIImagePickerController 获取 UIImage 元数据?像“.location”
- laravel - DOMPDF 在服务器中运行良好,但在服务器中出现 http 错误 503
- ios - 在 Scenekit 中添加动画到 SCNNode
- websecurity - 如果 HttpOnly cookie 在每个请求中自动传递,它们如何防止 XSS/注入攻击?
- r - dplyr mutate 中的动态语句
- r - 如何从 R 中获取可以立即粘贴到 Windows 中的路径字符串
- flutter - Flutter Hooks Widget useState() with Object
- angular - 我们可以将 CSS 类从 Angular 组件添加/附加到反应式表单控件吗?