如何在docker构buildDockerfile时cachingRUN npm install指令
我目前正在为我的应用程序开发一个Node后端。 当dockerizing它(docker build)时,最长的阶段是RUN npm install
。 RUN 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