在Docker构建Dockerfile时如何缓存RUN npm安装指令

我目前正在为我的应用程序开发Node后端。在对其进行docker化(docker build)时,最长的阶段是RUN npm install。该RUN

npm install指令在每个小的服务器代码更改上运行,通过使开发人员每次等待构建完成来影响生产率。

我发现在应用程序代码所在的位置运行npm

install并使用ADD指令将node_modules添加到容器中可以解决此问题,但这远非最佳实践。这有点破坏了将其Docker化的整个想法,并且使容器的重量增加了很多。

还有其他解决方案吗?

回答:

好的,所以我发现了这篇有关写docker文件时效率的精彩文章。

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

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构建上的npm安装阶段,只需复制这些行并将^ / opt / app ^更改为您的应用在容器中的位置。

以上是 在Docker构建Dockerfile时如何缓存RUN npm安装指令 的全部内容, 来源链接: utcz.com/qa/433915.html

回到顶部