Docker没有缓存npm install

时间:2015-08-02 14:58:40

标签: node.js caching docker npm

我似乎无法使我的dockerfile缓存我的npm install。我将它设置为所有示例都指定,并且package.json没有更改,但它仍然下载所有依赖项。

这是我拥有的

FROM mf/nodebox

# Maintainer
MAINTAINER Raif Harik <reharik@gmail.com>

RUN rm /bin/sh && ln -s /bin/bash /bin/sh

ADD /app/package.json /tmp/package.json
RUN cd /tmp && npm install && npm install -g babel
RUN cd /tmp && cp -a /tmp/node_modules /opt/app/current/node_modules

# Entrypoint to docker shell
ENTRYPOINT ["docker-shell"]

#this is the flag that tells the docker-shell what mode to execute
# Startup commands
CMD ["-r"]

# set WORKDIR
WORKDIR /opt/app/current

# Add shell script for starting container
ADD ./docker-shell.sh /usr/bin/docker-shell
RUN chmod +x /usr/bin/docker-shell

COPY /app /opt/app/current

然后我得到的输出是

Building domain...
Step 0 : FROM mf/nodebox
 ---> 4ee7c51a410d
Step 1 : MAINTAINER Raif Harik <reharik@gmail.com>
 ---> Using cache
 ---> 78d0db67240c
Step 2 : RUN rm /bin/sh && ln -s /bin/bash /bin/sh
 ---> Using cache
 ---> d7d360d8f89a
Step 3 : ADD /app/package.json /tmp/package.json
 ---> 5b373dae5141
Removing intermediate container f037272f49c3
Step 4 : RUN cd /tmp && npm install && npm install -g babel
 ---> Running in cb89bb6fc2d0
npm WARN package.json MF_Domain@0.0.1 No description

所以它缓存了前几个命令,但它在步骤3停止了ADD package.json,然后转到npm进行第4步。

修改

我想我应该提一下,当我在代码中部署一个新的更改时(或者我试验这个问题,只是相同的代码),而package.json保持不变,它会复制到deploy文件夹。我不知道docker是否检查了创建的日期,校验和,或者做了差异。如果它是创建日期,那么可能就是问题。

1 个答案:

答案 0 :(得分:1)

来自docker documentation

据说

  

ADDCOPY指令的情况下,检查放入图像的文件的内容。具体来说,对文件进行校验和,然后在高速缓存查找期间使用该校验和。如果文件中的任何内容发生了变化,包括其元数据,则缓存无效。

那些元数据包含文件修改时间。

有一些技巧可以解决这个问题(例如docker add cache when git checkout same file)。

另请参阅Docker github项目上的related discussion