2017-05-04 266 views
1

我们在版本控制中使用不包含node_modules的标准做法。但是,当通过CI/CD管道时,我们必须在几个地方重新安装NPM依赖关系,并且它使一切都非常缓慢。加速Docker容器中的NPM安装

有没有办法用Docker缓存NPM依赖关系?我搜索了Google“docker cache npm dependencies”,2014年的第一个搜索结果产生了一个死链接。

没有什么值得的。

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

这里是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"] 

这里是一个可能的解决方案,但我不能完全弄清楚它是如何工作的:

=>http://bitjudo.com/blog/2014/03/13/building-efficient-dockerfiles-node-dot-js/

+1

请问你Dockerfile样子? – n2o

+1

可能的解决方案是使用['-v'](https://docs.docker.com/engine/reference/commandline/run/#mount-volume-v---read-only)选项Docker命令行将'〜/ .npm'映射到容器中的〜/ .npm。这种方式在后续执行时使用已经填充的缓存。但是,这种改进并不出色,它仍然需要很长时间才能解决依赖关系。 – axiac

+0

我刚刚添加了我的Dockerfile,谢谢 –

回答

2

你试过使用纱线而不是npm这是更快?纱做平行安装包

https://yarnpkg.com/lang/en/compare/

+0

是啊我在想那个,但是我得先安装纱线 –

+0

没有纱线比使用NPM有更多的好处吗?如果您可以将它用于基础图像,我认为它是值得的。如果不是那么我不知道。对于码头工人,我是一个新手。 – Jamesed

+0

是的,但我不认为Yarn会作为基础图像的一部分,因此我必须执行npm install -g yarn,然后运行yarn。我也不是说某些纱线更快吗?有更快的速度有统计吗? –

2

此方法效果很神奇:

https://blog.playmoweb.com/speed-up-your-builds-with-docker-cache-bfed14c051bf

泊坞窗已为您缓存的事情一个特殊的方式,显然这是最好使用天生的缓存能力。

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

如果按照这种模式,它会为你工作:

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 
+2

在'COPY package.json/src'指令中,docker检查package.json文件是否已更改。如果它改变了,它将重新运行下面的“RUN”命令。它的作品,但如果你经常改变package.json它是一团糟。也许使用共享卷可能会更快地安装模块 –

+1

我同意,如果您经常更改package.json,它不会帮助任何人 –

相关问题