Docker 构建不使用来自 npm 的缓存 ci
Docker build does not use cache from npm ci
我创建了我的 Dockerfile,注意使用 docker 缓存系统。我将 package.json
和 package-lock.json
文件添加到一个干净的容器中,然后是 运行 npm ci
命令。如果 package.json
和 package-lock.json
未更改,我希望从缓存中使用它,但它保持 运行ning。
我错过了什么吗?我的 Dockerfile 有问题吗?
FROM node:13.10.1-stretch as base
ADD package.json /app/package.json
ADD package-lock.json /app/package-lock.json
WORKDIR /app
RUN npm ci --unsafe-perm
我得到的输出:
Step 1/12 : FROM node:13.10.1-stretch as base
---> 7aef30ae6655
Step 2/12 : ADD package.json /app/package.json
---> ce655a3453f2
Step 3/12 : ADD package-lock.json /app/package-lock.json
---> 797cda1e10b2
Step 4/12 : WORKDIR /app
Removing intermediate container 5b6929b80ad6
---> 80c2aac903c5
Step 5/12 : RUN npm ci --unsafe-perm
---> Running in 7732a8aca146
> fsevents@1.2.12 install /app/node_modules/webpack-dev-server/node_modules/fsevents
> node-gyp rebuild
make: Entering directory '/app/node_modules/webpack-dev-server/node_modules/fsevents/build'
SOLINK_MODULE(target) Release/obj.target/.node
COPY Release/.node
make: Leaving directory '/app/node_modules/webpack-dev-server/node_modules/fsevents/build'
[...]
假设你没有 运行 其他命令 before 添加 package.json
,你的 Dockerfile
是好的,添加你的图层包文件被缓存。例如,我们构建一个简单的 Dockerfile,它只添加您的 package.json
配置文件:
FROM node:13.10.1-stretch as base
ADD package.json /app/package.json
第一个运行:
$ docker build -t so-example .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM node:13.10.1-stretch as base
13.10.1-stretch: Pulling from library/node
[...]
Status: Downloaded newer image for node:13.10.1-stretch
---> 7aef30ae6655
Step 2/2 : ADD package.json /app/package.json
---> a7bb80c06ecb
Successfully built a7bb80c06ecb
Successfully tagged so-example:latest
第二个运行
$ docker build -t so-example .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM node:13.10.1-stretch as base
---> 7aef30ae6655
Step 2/2 : ADD package.json /app/package.json
---> Using cache
---> a7bb80c06ecb
Successfully built a7bb80c06ecb
Successfully tagged so-example:latest
如您所见,缓存有效。你能用这样一个最小的例子来验证这一点吗?大部分时间缓存中断是因为次优顺序。请检查以下内容:
- 执行构建命令两次。缓存只能在第一个 运行
之后工作
- 确保没有在您的 Dockerfile 中执行您可能未在此处发布的其他步骤,这些步骤会使缓存失效
- 有没有清理命令运行ning?
docker prune
或 docker image prune
之类的东西(或旧版本上的手动 list/delete 图片)会删除你的图片
- Check/post 你调用你如何构建图像
我创建了我的 Dockerfile,注意使用 docker 缓存系统。我将 package.json
和 package-lock.json
文件添加到一个干净的容器中,然后是 运行 npm ci
命令。如果 package.json
和 package-lock.json
未更改,我希望从缓存中使用它,但它保持 运行ning。
我错过了什么吗?我的 Dockerfile 有问题吗?
FROM node:13.10.1-stretch as base
ADD package.json /app/package.json
ADD package-lock.json /app/package-lock.json
WORKDIR /app
RUN npm ci --unsafe-perm
我得到的输出:
Step 1/12 : FROM node:13.10.1-stretch as base
---> 7aef30ae6655
Step 2/12 : ADD package.json /app/package.json
---> ce655a3453f2
Step 3/12 : ADD package-lock.json /app/package-lock.json
---> 797cda1e10b2
Step 4/12 : WORKDIR /app
Removing intermediate container 5b6929b80ad6
---> 80c2aac903c5
Step 5/12 : RUN npm ci --unsafe-perm
---> Running in 7732a8aca146
> fsevents@1.2.12 install /app/node_modules/webpack-dev-server/node_modules/fsevents
> node-gyp rebuild
make: Entering directory '/app/node_modules/webpack-dev-server/node_modules/fsevents/build'
SOLINK_MODULE(target) Release/obj.target/.node
COPY Release/.node
make: Leaving directory '/app/node_modules/webpack-dev-server/node_modules/fsevents/build'
[...]
假设你没有 运行 其他命令 before 添加 package.json
,你的 Dockerfile
是好的,添加你的图层包文件被缓存。例如,我们构建一个简单的 Dockerfile,它只添加您的 package.json
配置文件:
FROM node:13.10.1-stretch as base
ADD package.json /app/package.json
第一个运行:
$ docker build -t so-example .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM node:13.10.1-stretch as base
13.10.1-stretch: Pulling from library/node
[...]
Status: Downloaded newer image for node:13.10.1-stretch
---> 7aef30ae6655
Step 2/2 : ADD package.json /app/package.json
---> a7bb80c06ecb
Successfully built a7bb80c06ecb
Successfully tagged so-example:latest
第二个运行
$ docker build -t so-example .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM node:13.10.1-stretch as base
---> 7aef30ae6655
Step 2/2 : ADD package.json /app/package.json
---> Using cache
---> a7bb80c06ecb
Successfully built a7bb80c06ecb
Successfully tagged so-example:latest
如您所见,缓存有效。你能用这样一个最小的例子来验证这一点吗?大部分时间缓存中断是因为次优顺序。请检查以下内容:
- 执行构建命令两次。缓存只能在第一个 运行 之后工作
- 确保没有在您的 Dockerfile 中执行您可能未在此处发布的其他步骤,这些步骤会使缓存失效
- 有没有清理命令运行ning?
docker prune
或docker image prune
之类的东西(或旧版本上的手动 list/delete 图片)会删除你的图片 - Check/post 你调用你如何构建图像