【问题标题】:Docker build does not use cache from npm ciDocker 构建不使用来自 npm ci 的缓存
【发布时间】:2020-07-05 19:56:22
【问题描述】:

我创建了我的 Dockerfile,并注意使用 docker 缓存系统。我将package.jsonpackage-lock.json 文件添加到一个干净的容器中,然后运行npm ci 命令。如果package.jsonpackage-lock.json 没有更改,我希望它可以从缓存中使用,但它会继续运行。 我错过了什么吗?我的 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'
[...]

【问题讨论】:

    标签: node.js json docker npm docker-build


    【解决方案1】:

    假设你没有运行其他命令之前 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 中没有执行您可能未在此处发布的其他步骤,从而使缓存无效
    • 是否有任何清理命令正在运行? docker prunedocker image prune(或旧版本上的手动列表/删除图像)之类的东西会删除您的图像
    • 检查/发布您的通话是如何构建映像的

    【讨论】:

    • 哦,我有 docker prune 删除所有悬空实体。由于此容器使用构建器模式,因此这部分不会出现在最终图像中。可能这就是docker prune 删除它的原因。我已经删除了prune 命令,它可以工作,谢谢。
    猜你喜欢
    • 2018-06-27
    • 1970-01-01
    • 2018-02-06
    • 2021-04-07
    • 2022-07-27
    • 2021-08-04
    • 1970-01-01
    • 2023-03-05
    • 2016-06-16
    相关资源
    最近更新 更多