Docker和node_modules – 把它们放在一个图层或一个卷中?

我正在计划一个docker开发环境,并怀疑将npm install作为caching层是否是一个好主意。

据我所知,有很多方法可以优化dockerfiles以避免重buildnode_modules,除非package.json发生更改 ,但是我不想每次package.json更改时都完全重buildnode_modules 。 一个新鲜的npm install需要5分钟以上,并且对package.json更改经常发生。 对于经常检查pull请求和转换分支的人来说,他们可能不得不每天忍受5分钟的npm installs

在像我这样的情况下,将node_modules安装到一个卷中是否会更好,以便它在整个构build中保持不变,对package.json小改动不会导致整个依赖树被重build?

是。 不要一遍又一遍重buildnode_modules 。 只需将它们粘贴到数据容器中,并将其装入只读。 您可以让中央进程立即重buildnode_modules

作为一个额外的好处,你得到一个更可预测的构build,因为你可以强制每个人都使用相同的节点模块。 如果你想确定你真的testing了你打算投入生产的同样的东西,这是至关重要的。

像这样(未经testing!):

 docker build -t my/module-container - <<END_DOCKERFILE FROM busybox RUN mkdir -p /usr/local/node VOLUME /usr/local/node END_DOCKERFILE docker run --name=module-container my/module-container docker run --rm --volumes-from=module-container \ -v package.json:/usr/local/node/package.json \ /bin/bash -c "cd /usr/local/node; npm install" 

现在,数据容器module-container将在/usr/local/node/node_modules包含由package.json指定的模块。 现在应该可以使用--volume-from=module-container将其安装在生产容器--volume-from=module-container