当package.json或package-lock.json中的某些内容被更改时,Docker不使用构建缓存,即使这只是文件中的版本号,也不会更改依赖项。
我如何实现它,所以码头使用旧的构建缓存和跳过npm安装(npm )每次?我知道码头在看修改过的文件日期。但是package.json一点也不更改版本号。
下面是我的Dockerfile
FROM node:10 as builder
ARG REACT_APP_BUILD_NUMBER=X
ENV REACT_APP_BUILD_NUMBER="${REACT_APP_BUILD_NUMBER}"
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY .npmrc ./
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY nginx/nginx.conf /etc/nginx/nginx.conf
COPY --from=builder /usr/src/app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]发布于 2020-10-04 09:10:27
以下是一些应该有助于缓解这个问题的解决方案。两者都有取舍,但它们不一定是相互排斥的--它们可以混合在一起,以获得更好的整体构建性能。
解决方案I: Docker BuildKit缓存挂载
码头BuildKit可以使用实验性的RUN --mount=type=cache标志部分缓解此问题。在映像构建过程中,它支持可重用的缓存挂载。
这里的一个重要警告是,对Docker BuildKit的支持在CI/开发环境之间可能会有很大差异。检查文档和构建环境,以确保它有适当的支持(否则,它将出错)。以下是一些要求(但不一定是详尽无遗的清单):
DOCKER_BUILDKIT=1显式启用,或者默认情况下通过守护进程/cli配置启用。Dockerfile的开头需要一个注释来启用实验支持:# syntax=docker/dockerfile:experimental下面是一个使用此特性的示例Dockerfile,将npm依赖项本地缓存到/usr/src/app/.npm,以便在后续构建中重用:
# syntax=docker/dockerfile:experimental
FROM node
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json package-lock.json /usr/src/app
RUN --mount=type=cache,target=/usr/src/app/.npm \
npm set cache /usr/src/app/.npm && \
npm ci备注:
npm仍然需要将它们安装到node_modules目录中。用一个中等规模的项目进行测试表明,这确实减少了一些构建时间,但是构建node_modules仍然是不可忽略的。/usr/src/app/.npm将不包含在最终构建中,并且只在构建时可用(但是,将存在一个挥之不去的.npm目录)。node_modules。删除package.json中的依赖项可能是不恰当的。如果有人尝试,你的学识可能会有所不同。解决方案二:在复制package.json之前安装依赖项
在主机上,脚本只从dependencies和devDependencies中提取package.json标记,并复制新文件(如package-dependencies.json )中的标记。
例如package-dependencies.json
{
"dependencies": {
"react": "^16.13.1"
},
"devDependencies": {
"gulp": "^4.0.2",
}
}在Dockerfile中,COPY package-dependencies.json和package-lock.json并安装依赖项。然后,复制原始的package.json。除非package-lock.json或package.json的dependencies/devDependencies标记发生更改,否则将从以前的构建中缓存和重用这些层,这意味着对package.json的微小更改将不需要运行npm ci/npm install。
下面是一个示例:
FROM node
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
# copy dependency list and locked dependencies
COPY package-dependencies.json package-lock.json /usr/src/app/
# install dependencies
RUN npm ci
# copy over the full package configuration
COPY package.json /usr/src/app/
# ...
RUN npm run build
# ...备注:
npm ci。package-dependencies.json将出现在图层历史中。虽然这个文件的大小可以忽略不计/微不足道,但它仍然是“浪费空间”,因为在最终图像中不需要它。package-dependencies.json需要一个快速脚本。根据构建环境的不同,这很难实现。下面是一个使用cli实用程序jq的示例: cat package.json \ jq -S‘。with_entries(select (.key as $k \“依赖项”,"devDependencies“)index++索引($k))index‘>包-依赖关系..key解决方案三:所有上述
解决方案I将启用本地缓存npm依赖关系,以加快依赖性获取。只有更新依赖项或开发依赖项时,解决方案II才会触发npm ci/npm install。这些解决方案可以一起使用,以进一步加快构建时间。
https://stackoverflow.com/questions/63961934
复制相似问题