如何在docker构buildDockerfile时cachingRUN npm install指令

我目前正在为我的应用程序开发一个Node后端。 当dockerizing它(docker build)时,最长的阶段是RUN npm installRUN npm install指令代表每个小型服务器代码更改,通过使开发人员等待每次完成构build来影响生产力。

我发现在应用程序代码所在的位置运行npm install并使用ADD指令将node_modules添加到容器可以解决这个问题,但这远非最佳实践。 这种方式打破了docker化的整体思路,导致集装箱重量增加。

任何其他解决scheme

好的,所以我在写一个docker文件时发现了这个关于效率的好文章 。

这是运行RUN npm install指令之前添加应用程序代码的错误docker文件的示例:

 FROM ubuntu RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list RUN apt-get update RUN apt-get -y install python-software-properties git build-essential RUN add-apt-repository -y ppa:chris-lea/node.js RUN apt-get update RUN apt-get -y install nodejs WORKDIR /opt/app COPY . /opt/app RUN npm install EXPOSE 3001 CMD ["node", "server.js"] 

通过将应用程序副本分成2个COPY指令(一个用于package.json文件,另一个用于其他文件),并在添加实际代码之前运行npm install指令,任何代码更改都不会触发RUN npm install指令,只有package.json的变化会触发它。 更好地练习docker文件:

 FROM ubuntu MAINTAINER David Weinstein <david@bitjudo.com> # install our dependencies and nodejs RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list RUN apt-get update RUN apt-get -y install python-software-properties git build-essential RUN add-apt-repository -y ppa:chris-lea/node.js RUN apt-get update RUN apt-get -y install nodejs # use changes to package.json to force Docker not to use the cache # when we change our application's nodejs dependencies: COPY package.json /tmp/package.json RUN cd /tmp && npm install RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/ # From here we load our application's code in, therefore the previous docker # "layer" thats been cached will be used if possible WORKDIR /opt/app COPY . /opt/app EXPOSE 3000 CMD ["node", "server.js"] 

这是package.json文件添加的地方,安装它的依赖项并将它们复制到应用程序所在的容器WORKDIR中:

 ADD package.json /tmp/package.json RUN cd /tmp && npm install RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/ 

为了避免每个docker构build中的npm安装阶段,只需复制这些行并将^ / opt / app ^更改为应用程序在容器中的位置。

我想你可能已经知道,但是你可以在同一个文件夹中包含一个.dockerignore文件

 node_modules npm-debug.log 

以避免在推入docker集线器时造成图像膨胀

我发现最简单的方法是利用Docker的复制语义:

COPY指令复制新文件或目录,并将它们添加到path中容器的文件系统。

这意味着如果你首先显式复制package.json文件,然后运行npm install步骤,那么你可以复制其余的源代码目录。 如果package.json文件已经改变,那么这将是新的,它将重新运行npm安装caching,为将来的版本。

Dockerfile结尾的代码片段如下所示:

 # install node modules COPY package.json /usr/app/package.json RUN cd /usr/app && npm install # install application COPY . /usr/app