Dockerfile 使用 npm 缓存

问题描述

我有一个 Dockerfile:

FROM node:13.7
workdir /usr/src/app
RUN env

# Layer for npm
copY package.json package-lock.json ./
RUN npm ci
# Bundle app source
copY . .
RUN git config http.sslVerify false
RUN npm run lib

RUN npm run docker-build

RUN rm -f .env
RUN ["chmod","+x","/usr/src/app/docker-entrypoint.sh"]
RUN ["chmod","/usr/src/app/wait-for-it.sh"]
CMD ./docker-entrypoint.sh

如果 package.json 或 package-lock.json 没有改变,我已经在做 npm ci 了。但我也想避免重新下载所有未更改的 npm 包。如何让 docker 使用 npm 缓存来存储和重用已下载的包?

解决方法

我认为您的 docker 缓存在命令 COPY . . 上失效。 您可以在构建日志中检查它并查看行 Using cache 并且在 copy 命令上它不存在,也许) 检查那个答案 Why does my Docker cache get invalidated by this COPY command?

伙计们说 .dockerignore 正在创建以避免处理不必要的文件并帮助我们忽略不必要文件的缓存。

所以,给出任何想法只是建议。

而且.. RUN npm run docker-build 看起来有些奇怪,因为 Dockerfile 正在创建以构建映像..

并且您可以在运行 docker build . 之前下载所有源代码,以避免从 git 的 Dockerfile 克隆它。 (RUN npm run lib 但我不知道它是什么行)

并且您可以使用多阶段构建 https://docs.docker.com/develop/develop-images/multistage-build/ 当您在第一阶段构建二进制文件或创建 js 包并将其复制到第二个新系统以尽可能减小图像大小时,它非常有用。

我可以更详细地描述这些要点中的任何一点,或者……请您提供更多关于您的情况的信息吗?

线是什么?

RUN npm run lib
RUN npm run docker-build

您可以在 +x 之前在主机上设置 docker build . 标志

RUN ["chmod","+x","/usr/src/app/docker-entrypoint.sh"]
RUN ["chmod","/usr/src/app/wait-for-it.sh"

为什么要在 Dockerfile 中这样做?