Node.js 加速在Docker容器中安装NPM

Node.js 加速在Docker容器中安装NPM,node.js,docker,dockerfile,Node.js,Docker,Dockerfile,我们使用的标准做法是在版本控制中不包含节点_模块。然而,当通过CI/CD管道时,我们必须在几个地方重新安装NPM依赖项,这使得一切都非常缓慢 有没有办法用Docker缓存NPM依赖项?我搜索了谷歌的“docker cache npm dependencies”,2014年的第一个搜索结果显示了一个死链接 没有其他有价值的东西了 一种解决方案是在版本控制中包含node_模块,但我认为这将是一个巨大的错误。我认为以某种方式缓存依赖项是最好的选择 以下是Dockerfile的原样: FROM node

我们使用的标准做法是在版本控制中不包含节点_模块。然而,当通过CI/CD管道时,我们必须在几个地方重新安装NPM依赖项,这使得一切都非常缓慢

有没有办法用Docker缓存NPM依赖项?我搜索了谷歌的“docker cache npm dependencies”,2014年的第一个搜索结果显示了一个死链接

没有其他有价值的东西了

一种解决方案是在版本控制中包含node_模块,但我认为这将是一个巨大的错误。我认为以某种方式缓存依赖项是最好的选择

以下是Dockerfile的原样:

FROM node:6

COPY . .  # copy all files, but node_modules does not exist ( => gitignored)

RUN npm install --no-optional --only=production > /dev/null 2>&1
RUN npm install -g bower  > /dev/null 2>&1
RUN bower install --config.interactive=false --allow-root > /dev/null 2>&1

ENTRYPOINT ["/bin/bash", "/root/cdt/run.sh"]
这里有一个可能的解决方案,但我不太清楚它是如何工作的:


=>

您是否尝试过使用纱线而不是更快的npm?纱线没有平行包装装置


此方法的效果非常神奇:

Docker为您提供了一种特殊的缓存方式,显然最好使用天生的缓存能力

不能说我完全理解它是如何工作的,但它确实工作

如果您遵循此模式,它将适用于您:

FROM mhart/alpine-node:5.6.0
WORKDIR /src

# Expose the port 3000
EXPOSE 3000

# Set the default command to run when a container starts
CMD ["node", "server.js"]

# Install app dependencies
COPY package.json /src
RUN npm install

# Copy your code in the docker image
COPY . /src

Dockerfile的外观如何?一种可能的解决方案是使用Docker命令行中的选项将容器中的
~/.npm
映射到
~/.npm
。这样,在后续执行时,它将使用已填充的缓存。然而,改进并不惊人,它仍然需要很长时间才能解决依赖关系。我刚刚添加了docker文件,thanksI添加了一个答案,我认为这可能是最好的解决方案,尽管可能还有一些补充解决方案。除非您特意更改它,否则大多数docker文件都是与root用户一起运行的。因此,使用该方法可能会在~/.npm中遇到权限问题。关于更多信息和解决方法,我正在考虑,但是我必须先安装纱线纱线纱线难道纱线不会比使用npm带来更多好处吗?我认为它是值得的,如果你可以使用它的基础形象。如果没有,我也不确定。说到docker,我是个新手。是的,可能吧,但我不认为纱线会成为基本形象的一部分,所以我必须先安装npm-g纱线,然后运行纱线。我也不是说某些纱线都那么快?有关于速度快多少的统计数据吗?还有一个npm纱线基准,可以在两者之间对性能进行基准测试。我想提一下,新的npm 5在速度上比纱线快或相当。由于Thread必须安装在docker中,因此只使用node version 8+可能会很有用,这是预安装的npm 5。在
COPY package.json/src
指令中,docker检查package.json文件是否已更改。如果已更改,它将重新运行下面的
运行
命令。它可以工作,但如果您经常更改package.json,则会造成混乱。也许使用共享卷可以安装模块fasterI同意,如果您经常更改package.json,这对任何人都没有帮助