Docker和node_modules - 将它们放在一个层或一个卷中?

时间:2014-12-24 21:33:51

标签: node.js docker node-modules

我正在规划一个docker dev环境,并怀疑将npm install作为缓存层运行是一个好主意。

我知道有ways to optimize dockerfiles to avoid rebuilding node_modules unless package.json changes,但是每次node_modules更改时我都不想完全重建package.json。新的npm install对我们来说需要5分钟以上,对package.json的更改会经常发生。对于经常审查拉取请求和切换分支的人来说,他们可能不得不每天花费5分钟npm installs的真气。

在像我这样的情况下以某种方式将node_modules安装到卷中以使其在构建中保持不变并且package.json的小变化不会导致整个依赖树正在重建?

1 个答案:

答案 0 :(得分:9)

是。不要一遍又一遍地重建node_modules。只需将它们粘贴在数据容器中,然后将其挂载即可读取。您可以立即重建node_modules中央流程。

作为一个额外的好处,您可以获得更可预测的构建,因为您可以强制每个人都使用相同的节点模块。如果您想确保实际测试的是您计划投入生产的相同内容,这一点至关重要。

像这样(未经测试!):

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将包含package.json/usr/local/node/node_modules指定的模块。现在应该可以使用--volume-from=module-container将其挂载到生产容器中。